C言語(ドラフト)cの汎用関数とパラメトリックタイプを可能にする提案。ここでプロトタイプがあります。
Psyche-Cは、C言語のコンパイラフロントエンドです。ビルドセットアップを理解することなく、Cプログラムの静的分析ツールの実装に焦点を当てたライブラリとして設計されています。ベローズは、精神-Cの主な特徴です:
struct 、 union 、 enum 、およびtypedefのオプションのタイプ推論( #include failuresのため)。Psyche-CのネイティブAPIはC ++ですが、他の言語のAPIが計画されています。
void analyse ( const SourceText& srcText, const FileInfo& fi)
{
ParseOptions parseOpts;
parseOpts. setAmbiguityMode (AmbiguityMode::DisambiguateAlgorithmically);
auto tree = SyntaxTree::parseText (srcText,
TextPreprocessingState::Preprocessed,
TextCompleteness::Fragment,
parseOpts,
fi. fileName ());
auto compilation = Compilation::create ( " code-analysis " );
compilation-> addSyntaxTree (tree. get ());
AnalysisVisitor analysis (tree. get (), compilation-> semanticModel (tree. get ()));
analysis. run (tree-> translationUnitRoot ());
}SyntaxVisitor::Action AnalysisVisitor::visitFunctionDefinition ( const FunctionDefinitionSyntax* node) override
{
const sym = semaModel-> declaredSymbol (node);
if (sym-> kind () == SymbolKind::Function) {
const FunctionSymbol* funSym = sym-> asFunction ();
// ...
}
return Action::Skip;
}
Psyche-CにはCnippetドライバーが付属しており、Cスニペットの通常のパーサーとして使用できます。たとえば、 Cnippetで下のスニペットをコンパイルすると、GCCまたはClangで表示される診断と同様の診断が表示されます。
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyche-Cは、オプションで(これまでのところ、元のブランチでのみ利用可能)、不足しているタイプのCスニペットを推測できます。たとえば、以下のスニペットの場合、Psyche-Cは、コンピレーション中にTするための(編集可能な)宣言を推測できます。
void f ()
{
T v = 0 ;
v -> value = 42 ;
v -> next = v ;
} typedef struct TYPE_2__ TYPE_1__ ;
struct TYPE_2__
{
int value ;
struct TYPE_2__ * next ;
} ;
typedef TYPE_1__ * T ;この機能を以下に使用することをお勧めします。
Haskellで記述されているタイプの推論を除き、Psyche-CはC ++ 17で記述されています。 CnippetはPython 3で書かれています。
構築するには:
cmake CMakeLists.txt && make -j 4
テストを実行するには:
./test-suite
Psyche-C自体の:
Cの推論をタイプ:不完全なプログラムの静的分析へのアプリケーション
プログラミング言語とシステムに関するACMトランザクション - Toplas 、第42巻、第3号、第15条、2020年12月。
不完全なCプログラムの静的セマンティクスの推論
プログラミング言語に関するACMの議事録、第2巻、Issue Popl 、2018年1月、第29条。
Psyche-Cを使用してください:
スレイド:最適化されたアセンブリのためのポータブル小言語モデルの逆コンパイラ
コード生成と最適化に関するIEEE/ACM国際シンポジウムの議事録-CGO 、2024。
Anghabench:コードサイズの削減のための100万個のコンパイル可能なCベンチマークを備えたスイート
コード生成と最適化に関するIEEE/ACM国際シンポジウムの議事録 - CGO 、2021。
メモリ - 不適切な言語での配列のインバウンド入力の生成
コード生成と最適化に関するIEEE/ACM国際シンポジウムの議事録 - CGO 、2019年2月、p。 136-148。
構造化されたコードのタスクの自動注釈
並行アーキテクチャと編集技術に関する国際会議の議事録 -協定、2018年11月、第31条。