Diagnostics存放于源代码clang/lib/Basic中,足说明它是一个很基础的类,贯穿整个clang。DiagnosticsEngine是供前端报告错误、警告、提示等消息的具体类,它需要一个翻译单元和位置管理器(DiagnosticsEngine is tied to one translation unit and one SourceManager,因为一般编译打印的诊断信息主要就是错误的位置、错误类型)。
在这个案例项目中,可以学习如何使用DiagnosticsEngine(生成warnings,errors,fixit). 欢迎查看手把手教程。 clazy 通过clazy,Clang可以对QT项目进行针对性的语义分析。从“不必要的内存分配”到“错误使用API”,开发者可以获取50多条QT提示(包括fixit和自动重构)。 LibreOffice LibreOffice项目在代码构建过程中,广泛使用Clang...
=std::string::npos){// Get the diagnostic engineauto&DE=f->getASTContext().getDiagnostics();...
EmitBackendOutput函数声明在clang/include/clang/CodeGen/BackendUtil.h,具体实现在clang/lib/CodeGen/BackendUtil.cpp中。 void clang::EmitBackendOutput(DiagnosticsEngine &Diags, const HeaderSearchOptions &HeaderOpts, const CodeGenOptions &CGOpts, const clang::TargetO...
{ public: // 当一个错误发生时,会调用此函数,我会在这个函数里通过Info.getID()取得Diagnostic ID,然后对应地取出规范ID virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) { TextDiagnosticPrinter::HandleDiagnostic(DiagLevel, Info); // 例如检查三字母词(trigraph)的...
这个方法前面获取前端编译的 DiagnosticsEngine ,clang前端编译时就是通过这个对象报错的,该类的注释信息如下。也就是说如果这个代码出现编译错误,会直接退出,不会进行静态代码分析,这个算是clang静态代码分析的一个不足,只有前端编译通过的代码才会进行静态代码分析。
首先创建 DiagnosticsEngine(通过 createDiagnostics()),然后创建并设置 TargetInfo,然后依次创建 FileManager(通过 createFileManager()),SourceManager(通过 createSourceManager (FileManager &FileMgr)),最后创建 Preprocessor(createPreprocessor(TranslationUnitKind))。
上面的代码中主要先看看MyPluginASTAction的ParseArgs方法,这是一个插件的入口函数,在这个方法里面调用了一个叫DiagnosticsEngine对象的Report方法,这段代码的主要功能是向编译器报告一个错误,而错误的描述就是“My plugin Started...”,下面会有具体的演示效果。关于其它部分的代码现在可以暂时不用理会,后续的章节会进行...
DiagnosticsEngine提供issues报告的功能 词法分析 本节以下面的代码的函数返回值void为例介绍词法分析的流程: 代码语言:javascript 复制 voidtestC(){} 本段结束后,会有一个流程图,方便对本节内容理解和记忆 Preprocessor::Initialize函数在被初始化调用时,会通过IdentifierTable的AddKeywords方法先初始化编程语言关键字 ...
diag.Report(propertyDecl->getBeginLoc(), diag.getCustomDiagID(DiagnosticsEngine::Warning, "%0 - 这个地方推荐使用copy!!"))<< typeStr; } } } }; //第二步:扫描配置完毕 //3、自定义CJLASTConsumer,继承自ASTConsumer,用于监听AST节点的信息 -- 过滤器 ...