3

uncrustifyを使用して、C および C++ コードでいっぱいのディレクトリをフォーマットしています。uncrustify が結果のコードを変更しないようにする必要があります。オブジェクト ファイルにはタイムスタンプがあり、同じになることはないため、オブジェクト ファイルまたはバイナリで差分を作成することはできません。何年もここにいるので、ファイルのソースを 1 つずつ確認することはできません。

プロジェクトはビルド プロセスにmakeを使用するため、チェックできるものをそこに出力する方法があるかどうか疑問に思っていました。

SO と Google を検索しても無駄だったので、これが重複している場合は申し訳ありません。

編集: gcc/g++ を使用し、32 ビット用にコンパイルしています。

4

1 に答える 1

2

1 つの可能性は、それらを CLang でコンパイルし、出力を LLVM IR として取得することです。メモリが機能する場合、これは のコマンド ライン引数である必要があり-S -emit-llvmます。

gcc/g++ で同じことを行うには、そのフラグの 1 つを使用して、コンパイルのある段階で中間表現を含むファイルを生成できます。初期段階では、空白などの変更による違いがまだ見られますが、簡単なテストでは、SSA 段階までに、そのような非運用上の変更が IR から消えていることが示されています。

g++ -c -fdump-tree-ssa foo.cpp

通常のオブジェクト ファイルに加えて、foo.cpp.018t.ssaソース ファイル内のセマンティック アクションを表すという名前のファイルが生成されます。

上で述べたように、私はこれほど広範なテストを行っていませんが、この段階では、操作に関係のない変更によって、異なる出力ファイルが生成される可能性があります (ちょっと疑問ですが)。必要に応じて、コンパイルのすべての-fdump-tree-all段階から出力を取得するために使用できます1。単純な経験則として、後の段階では書式設定などの変更の影響を受けにくいと予想されるため、ssa 段階が機能しない場合、次の選択肢はおそらく最後の段階の 1 つである段階になるでしょう。 (注: 生成されたファイルは、各ファイルを生成した段階の順に番号が付けられているため、すべての段階をダンプすると、初期段階で生成されたものと後の段階で生成されたものは明らかです)。optimized


1. これによりかなりの数のファイルが生成され、その多くは非常に大きいことに注意してください。初めてこれを行うときは、いわば、ファイルに溺れないように、ディレクトリ内の単一のソース ファイルに対して単独で実行することをお勧めします。また、この方法でのコンパイルに通常よりかなり長い時間がかかっても驚かないでください。

于 2016-06-27T13:53:08.313 に答える