You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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_配合,部分场景下可以触发对类类型的返回值检查:
    _Check_return_ _Must_inspect_result_ std::string bar() {
        return "test";
    }
    
    注意:这个方法在VS2015中不一定100%生效,因为当时的规则对类类型的支持有限。
  • 启用更严格的代码分析规则集:在项目属性的「代码分析」->「规则集」中,选择「Microsoft All Rules」,或者手动勾选「C6031: 返回值被忽略」的扩展规则,尝试让分析器覆盖类类型的检查。
  • 升级到更高版本VS(推荐):VS2017及以上版本对_Check_return_的支持更完善,同时也支持C++17的[[nodiscard]]属性,后者专门用于强制检查返回值是否被使用,对类类型和内置类型都有效:
    [[nodiscard]] std::string bar() {
        return "test";
    }
    
    调用时忽略返回值会直接触发警告,兼容性和效果都比旧版的_Check_return_更好。

内容的提问来源于stack exchange,提问作者Kentzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:10:15