小米科技|致完美主义者:0个错误,0个警告( 二 )


下面的一个例子演示了如何在代码分析器中使用这项新特性 。
从CAExcludePath到/external:*和/analyze:external*的迁移为了能够禁用外部开源代码库中的一些不必要的警告信息 , 我们创建了一个临时解决方案来使用特殊的环境变量(“CAExcludePath”) , 该变量可用于指定目录哪个代码分析不会报告任何警告 。
我们现在有一个更好的解决方案来控制外部头文件的代码分析行为 。 虽然我们决定保留“CAExcludePath”选项 , 但我们强烈建议切换到/external:* 和/analyze:external* 选项 。
使用这些选项 , 可以关闭外部头文件的代码分析 , 或使用与代码库其余部分不同的分析规则集合 。这些都具有更好的可用性和可维护性 , 因为它们都可以通过Visual Studio集成开发环境中获得 。
使用/analyze:external-和/external:*请考虑下面的头文件和源文件 , 它里面没有特别的功能 , 只是我们故意放入了一些错误 , 如下图所示:
【小米科技|致完美主义者:0个错误,0个警告】

当使用默认选项进行分析时 , 我们会从头文件和源文件中获得函数的代码分析警告如下:

现在 , 如果我们将 externallib.h 的目录添加到“外部包含目录” , 如下所示:

然后将“Disable Code Analysis for External Headers”设置为“Yes (/analyze:external-)”如下:

执行“运行代码分析”将不再报告来自外部头文件的任何代码分析警告:

根据模板参数 , 某些模板可能存在错误 。如果你想分析模板代码 , 即使它们在外部文件中 , 你可以将“外部头文件中的模板诊断”选项设置为“是 (/external:templates-)” 。现在 , 执行“运行代码分析”将报告模板函数的代码分析警告 , 即使它们在外部头文件中:

使用/analyze:external:ruleset 和 /external:*现在可以通过使用“外部头文件的分析规则集”选项指定不同的规则集文件来分析具有与代码库其余部分不同的规则集的外部文件 , 而不是关闭外部文件的代码分析 。
对于此示例 , 我创建了一个自定义规则集“ExternalHeaderRules” , 它仅启用两个规则 C6021 和 C6385 作为警告 。然后我为“外部头文件的分析规则集”选项选择了它 , 如下图所示:

请注意 , “禁用外部头文件的代码分析”选项设置为“否” , 启用对外部头文件的代码分析 。通过此更改 , 代码分析现在将使用自定义“ExternalHeaderRules”规则集分析来自外部文件的函数 , 并报告以下警告:

当前 , 如果使用“外部头文件的分析规则集” , 则会忽略“外部头文件中的模板诊断”选项 。我们计划更改行为以遵守该选项并将模板视为非外部模板 , 并应用通用规则集而不是外部头文件的规则集 。
加分项:更好的代码分析性能在我们研究此功能时 , 我们意识到一些内置检查器并没有真正跳过通过“CAExcludePath”环境变量排除的文件中的函数 。
取而代之的是 , 它们像其他函数一样被分析 , 并且从这些函数中产生的警告被简单地过滤掉了 。
随着我们添加针对 /external:* 选项的支持 , 我们更新了它们以支持“CAExcludePath”以及 /external:* 和 /analyze:external- 选项 , 并跳过对来自排除或外部文件的函数的分析 。
这导致在我们的生产代码库中观察到性能改进 , 从 25% 提升到了 30% 。
实际的性能改进将取决于有多少代码库来自排除或外部头文件 , 以及有多少项目使用 PCH 等 。
外部头文件和 Microsoft C++ 编译器Microsoft C++ 编译器中添加了几个新标志 , 用于指定外部包含目录及其警告和代码分析设置 。