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条。