使用libclang(libtooling),我如何启用和禁用特定的警告

With libclang (libtooling), how can I enable and disable specific warnings?

本文关键字:启用 警告 何启用 libtooling libclang 使用      更新时间:2023-10-16

我正在尝试使用libclang API以编程方式分析C++项目。我的clang编译很好,我的工具正确地解析了生成的AST,但我不知道如何打开/关闭特定的警告。

这是相关的代码片段,我想启用/禁用"未使用的变量"警告:

        clang::DiagnosticOptions mDiagnosticOptions;
        mDiagnosticOptions.ShowOptionNames      = 1; // prints warning, ie [-Wextra-tokens]
        mDiagnosticOptions.Warnings.push_back("unused-variable"); // <----- DOESN'T WORK
        // use mDiagnosticOptions further down for compile steps etc.
        .
        .
        .

您的代码片段不是libclang API(clang-c/Index.h(的一部分。如果你使用libclang,那么你可以通过调用来获得一个翻译单元

CXTranslationUnit clang_parseTranslationUnit(
        CXIndex CIdx,
        const char *source_filename,
        const char * const *command_line_args,
        int num_command_line_args,
        struct CXUnsavedFile *unsaved_files,
        unsigned num_unsaved_files,
        unsigned options);

您可以通过command_line_args参数禁用警告,例如

const char* const command_line_args[] = { "-Wall", "-Wno-unused-variable" };

我认为这里的问题在于;对编译步骤等使用mDiagnosticOptions;代码的一部分。特别是,如果使用ASTUnitLoadFromCommandLine方法,则必须传递一个包含DiagnosticOptionsDiagnosticsEngine,因此似乎应该天真地将该DiagnosticOptions配置为选择要启用的警告。

但是,LoadFromCommandLine解析其命令行,这样做将覆盖DiagnosticOptions中的一些信息,例如其WarningsIgnoreAllWarnings字段。(但它不会覆盖ShowOptionNames;幸存内容的细节没有记录下来,可能是由解析器的编写方式引起的。(

因此,您必须使用命令行语法启用和禁用警告:

commandLine.push_back("-Wunused-variable");     // enable one warning
commandLine.push_back("-Wno-unused-variable");  // disable one warning
commandLine.push_back("-w");                    // disable all warnings

在通过CCD_ 13到CCD_。