C語言(草稿)建議在C中啟用通用功能和參數類型;原型可在此處提供。
Psyche-C是C語言的編譯器前端。它被設計為庫,重點是實施C程序的靜態分析工具,而無需了解其構建設置。波紋管是Psyche-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的類型C:用於不完整程序的靜態分析的應用
ACM關於編程語言和系統的交易 - Toplas ,第42卷,第3期,第15條,2020年12月。
不完整C程序的靜態語義推理
ACM關於編程語言的會議記錄,第2卷,發行POPL ,2018年1月,第29條。
使用Psyche-C:
Slade:一種用於優化組裝的便攜式小語言模型分解器
IEEE/ACM國際代碼生成與優化研討會論文集-CGO ,2024年。
Anghabench:具有一百萬個可編譯基準的套件,用於降低密碼大小
IEEE/ACM國際代碼生成與優化研討會論文集 - CGO ,2021年。
在內存 - 不安全語言中生成數組的內部輸入
IEEE/ACM國際代碼生成與優化研討會論文集 - CGO ,2019年2月,第1頁。 136-148。
在結構化代碼中的任務自動註釋
國際平行體系結構與編譯技術會議論文集 -協定,2018年11月,第31條。