Clang AST仅查找语法错误

时间:2020-06-16 23:27:09

标签: c++ abstract-syntax-tree llvm-clang clang-tidy

我正在使用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

我希望得到任何建议!

0 个答案:

没有答案
相关问题