为什么要改
Visual Studio 集成的 Microsoft C++ Code Analysis 能帮助开发者在编译期发现潜在缺陷。
但在大型项目中,警告数量往往成千上万。
为了既保证代码质量,又避免“噪音”,团队需要一种清晰、可审计的警告抑制方式。
为此,微软在 Visual Studio 2022 17.14 及以后版本中推出了三项关键更新:
- SARIF 报告里完整记录抑制理由
[[gsl::suppress]]
支持 justification 字段#pragma warning
也支持 justification 字段
SARIF:让审计不再翻旧账
- 生成 SARIF:
cl /analyze:log:format:sarif /analyze:log:includesuppressed …
- 结果文件(*.sarif)中会列出每一条被抑制警告的 ID、位置及开发者填写的“原因”。
- 配合 VS Code SARIF Viewer 扩展即可图形化查看,代码审查时一目了然。
[[gsl::suppress]]
:Core Guidelines 专用
语法(C++ 代码):
[[gsl::suppress("bounds.1", justification: "手动越界检查已覆盖")]] { // 此处相关警告被抑制 }
- 仅作用于 C++ Core Guidelines 检查器发出的警告。
- 仅适用于 C++ 项目;C 项目仍需使用
#pragma warning
。
#pragma warning
:通用抑制也讲“道理”
Visual Studio 2022 17.14 起支持:
#pragma warning(suppress : 26481, justification : "与第三方接口兼容,已做边界校验")
- 可用于任何 MSVC 警告。
- 作用域到下一个语句或代码块,不改变代码结构。
二者如何取舍
场景 | 推荐方式 |
仅抑制 C++ Core Guidelines 警告 | [[gsl::suppress]] |
需要抑制普通 MSVC 警告 | #pragma warning |
旧代码不想大改 | 继续使用 #pragma warning(suppress) ,后续可补 justification |
带来的价值
- 可审计:理由直接留在源码与报告里,新人接手无门槛。
- 防回退:清楚说明“为什么可以忽略”,重构时更容易评估风险。
- 技术债可追踪:用脚本扫描 justification 为 “TODO” 或 “FIXME” 的抑制项,定期清理。
- 向前兼容:旧写法继续生效;新写法逐步替换即可。
完整示例
// example.cpp // 编译:cl /analyze:only /analyze:plugin:EspxEngine.dll ^ // /analyze:log:format:sarif /analyze:log:includesuppressed example.cpp int main() { int arr[10]; // C26494:未初始化 int* p = arr; // C26485:数组到指针退化 [[gsl::suppress("bounds.1", justification: "此范围已在上方手动检查越界")]] { int* q = p + 1; // C26481 被抑制 p = q++; // C26481 被抑制 } return 0; }
运行后会生成 example.nativecodeanalysis.sarif
,用 VS Code 打开即可看到被抑制警告的详细记录。
立即体验
- 更新到 Visual Studio 2022 17.14 或更高版本。
- 给新的抑制加上
justification
。 - 逐步为旧抑制补充理由,享受更透明的代码审查流程。
如有疑问或建议,欢迎在 Visual Studio Developer Community 提交反馈。
还没有评论,来说两句吧...