为何MSVS静态分析器忽略_Check_return_?如何正确标注该属性?
关于MSVS 2015中_Check_return_对std::string返回值无效的问题
为什么静态分析器忽略bar()的_Check_return_属性?
这是VS2015 Update 3静态分析器的版本局限性导致的:
- 该版本的静态分析规则中,
_Check_return_属性默认只对内置基础类型(比如int、bool、指针类型等)生效,目的是提醒开发者不要忽略像API错误码这类关键的返回值。 - 对于
std::string这类用户定义的类类型,静态分析器默认认为“忽略返回值”是合理场景(比如临时对象被自动销毁的情况),因此没有把这类类型纳入_Check_return_的检查范围。简单说就是,当时的规则没有覆盖类类型的返回值检查逻辑。
如何正确使用_Check_return_标注函数?
根据类型和VS版本,分两种情况处理:
1. 内置基础类型(如int、bool)
直接标注_Check_return_即可,静态分析器会正常触发忽略返回值的警告(C6031):
_Check_return_ int foo() { return 0; // 示例返回值 }
调用foo();而不处理返回值时,会得到“返回值被忽略”的警告。
2. 用户定义类型(如std::string)
在VS2015中,要让静态分析器检查类类型的返回值,需要结合额外的设置或属性:
- 尝试结合
_Must_inspect_result_属性:这个属性和_Check_return_配合,部分场景下可以触发对类类型的返回值检查:
注意:这个方法在VS2015中不一定100%生效,因为当时的规则对类类型的支持有限。_Check_return_ _Must_inspect_result_ std::string bar() { return "test"; } - 启用更严格的代码分析规则集:在项目属性的「代码分析」->「规则集」中,选择「Microsoft All Rules」,或者手动勾选「C6031: 返回值被忽略」的扩展规则,尝试让分析器覆盖类类型的检查。
- 升级到更高版本VS(推荐):VS2017及以上版本对
_Check_return_的支持更完善,同时也支持C++17的[[nodiscard]]属性,后者专门用于强制检查返回值是否被使用,对类类型和内置类型都有效:
调用时忽略返回值会直接触发警告,兼容性和效果都比旧版的[[nodiscard]] std::string bar() { return "test"; }_Check_return_更好。
内容的提问来源于stack exchange,提问作者Kentzo
相关产品推荐
相关产品推荐

