内容提要
Visual Studio 2022 17.8新增了多项安全检查,包括C++17以上迁移、查找拼写错误、指针比较、InterlockedCompareExchange误用、闰年检查等。这些检查能够提高代码质量和安全性。
延伸解读
C++17求值顺序变化带来的迁移风险
C6395检查针对C++17前后表达式求值顺序的变化。例如a[++i] = i在C++17前是未定义行为,C++17后顺序标准化,但MSVC在不同语言模式下行为不同。该检查帮助开发者发现因切换语言模式而可能改变程序语义的代码,避免迁移到C++17及以上版本时引入隐蔽错误。
拼写错误类检查:从流输出到sizeof
C6392、C6396和C6397专注于发现因拼写错误导致编译通过但行为异常的代码。C6392防止误用cout输出宽字符串地址;C6396捕捉sizeof参数中的拼写错误,避免错误的偏移计算;C6397检查对取地址结果与nullptr的无意义比较。这些检查能有效减少低级错误,提升代码可靠性。
闰年相关检查需显式启用
C6393、C6394、C26861至C26864等闰年检查属于“opt-in”规则,必须在规则集文件中显式包含并启用才会生效。它们覆盖容器存储不足、日期字段直接修改、类型转换不完整、忽略返回值以及假设每年365天等场景,帮助开发者避免闰年处理错误。
InterlockedCompareExchange的优化陷阱
C26735检查InterlockedCompareExchange及其变体的误用。由于编译器优化,原本只读取一次的comparand值可能在生成的机器指令中被多次读取,导致原子操作失效。该检查能发现此类潜在问题,提醒开发者注意优化对原子操作的影响,确保代码正确性。
Q&A
Visual Studio 2022 17.8新增了哪些安全检查?
新增的安全检查包括C++17迁移、拼写错误检查、指针比较、InterlockedCompareExchange误用和闰年检查等。
C6395检查的主要功能是什么?
C6395帮助开发者迁移到C++17及以上版本,确保表达式的求值顺序标准化。
如何避免C6392检查中提到的拼写错误?
使用wcout打印宽字符串,或确保字符串是非宽字符串,以避免错误输出地址。
C6397检查指针与nullptr比较的目的是什么?
C6397检查确保指针比较不产生不必要的错误,避免将地址与nullptr进行比较。
C26861检查的内容是什么?
C26861检查直接修改日期时间对象的年、月、日字段,确保进行闰年验证。
如何创建自定义规则集以应用新检查?
需要使用规则集文件,并明确将新规则包含在规则集中,以便启用这些检查。