Cコンパイラがアセンブリを吐き出すことは誰もが知っています。
ただし、ツールが ANSI C の狭いサブセットのみを受け入れる研究を行っています。関数をインライン化したり、構造体をフラットにしたり、C コードを書き出すことができる C-to-C トランスレータはありますか?
Cコードを簡素化できる他のツールがあれば、聞かせてください。
Cコンパイラがアセンブリを吐き出すことは誰もが知っています。
ただし、ツールが ANSI C の狭いサブセットのみを受け入れる研究を行っています。関数をインライン化したり、構造体をフラットにしたり、C コードを書き出すことができる C-to-C トランスレータはありますか?
Cコードを簡素化できる他のツールがあれば、聞かせてください。
Clang は、インターネット上のさまざまな情報源から理解できる限り、AST を C に変換することができます。
結果の C コードを特に読みやすくする必要がない場合は、通常のコンパイラを使用してバイナリ実行可能ファイルを生成し、逆コンパイラを使用してバイナリから C コードを生成できます。逆コンパイラは、コンパイラがインライン展開した関数を「インライン展開」できない可能性が最も高いでしょう。ただし、構造体についてはわかりませんが、デバッグ シンボルを使用せずにコンパイルし、あまり洗練されていない逆コンパイラを使用すると、構造体がまったく検出されない可能性があります。
古い MIT プロジェクトの C2C (しばらくの間 FTP 上にありました) と新しい Cilk では、C->AST->C プロセスを実行できます。
Cilk と Cilk++ は積極的にメンテナンスされています。それらには、非常に優れた ANSI C パーサーが含まれています。
当社のDMS ソフトウェア リエンジニアリング ツールキットとそのC フロント エンドがこれを可能にします。
DMS は、解析、AST の構築、シンボル テーブル、一般的な AST の分析、およびコントロール/データフロー/ポイントから値の範囲の特定のアナライザーのための一般的な機構を提供するだけでなく、プロシージャルまたはパターンを使用して AST を任意に変換し、以下を含むソース テキストを再生成します。コメント。複数のコンパイル ユニットを同時に処理する DMS の機能により、複数のコンパイル ユニットに同時に影響を与えるグローバル アナライザーと変換が可能になります。
DMS の C フロント エンドは、これらすべてを C に特化しています (他のさまざまな言語用のフロント エンドがあります)。ANSI、GCC 3/4、MS Visual C、Green Hills C など、さまざまな方言を処理します。必要に応じて、他の方言用にカスタマイズできます。
DMS は、2600 万行のソフトウェア システムの分析を含む、さまざまな C 分析/変換プロジェクトに使用されています。
DMS の興味深いアプリケーションは、ポインター エラーが発生したときにそれをキャッチするように C ソースをインストルメント化することです (長い間遅れてクラッシュするのではなく)。CheckPointerツールを参照してください。このツールは、ソース コードを読み取り、追加のコードを挿入して各ポインター アクセスをチェックし、結果を書き出します。これを行う過程で、C コードを単純化されたサブセットに正規化し、多くの特殊なケースを取り除きます。この正規化は、OP がやりたいことの種類にかなり近いかもしれません。