我正在使用Clang创建一些内部静态代码分析器。对于其中一个分析器,我们需要获取一个原始字符串,并检查它是否存在语法错误。 我们不应该将缺少符号,缺少标题,无效的函数调用等视为无效的语法-唯一的意义就是查看其是否为有效的C / C ++代码。
起初我以为我可以使用ASTUnit
来做到这一点:
auto AST = tooling::buildASTFromCodeWithArgs(MyCode,
Args,
"input.cc",
"clang-tool",
std::make_shared<PCHContainerOperations>(),
tooling::getClangStripDependencyFileAdjuster(),
tooling::FileContentMappings(),
&DiagConsumer);
llvm::outs() << "hasUncompilableErrorOccurred " << AST->getDiagnostics().hasUncompilableErrorOccurred() << "\n";
llvm::outs() << "hasUnrecoverableErrorOccurred " << AST->getDiagnostics().hasUnrecoverableErrorOccurred() << "\n";
llvm::outs() << "hasErrorOccurred " << AST->getDiagnostics().hasErrorOccurred() << "\n";
接受两个输入:Hello world
和#include <undefined.h>
-在上面的输出中都产生1-即使#include <undefined.h>
是正确的C语句,但问题在于(与{{ 1}},这不是有效的C代码)-缺少hello world
。同样,如果未包含undefined.h
,则以int* p = malloc(sizeof(int));
作为代码将在所有这些调用中产生错误。
我尽力避免此类错误,因此除stdlib.h
以外的所有情况都将被视为有效代码。
我确实尝试通过创建Raw Lexer对其进行迭代,但是它不会给我足够的信息。
hello world
我希望得到任何建议!