Visual Studio Community 2019 中的 C++ 代码分析产生警告 C26486 和 C26414

Posted

技术标签:

【中文标题】Visual Studio Community 2019 中的 C++ 代码分析产生警告 C26486 和 C26414【英文标题】:C++ Code Analysis in Visual Studio Community 2019 produces warnings C26486 and C26414 【发布时间】:2020-01-28 19:27:48 【问题描述】:

我有以下示例程序

#include <iostream>

class MyClass

private:
    int value;
public:
    MyClass(int v) noexcept : value(v) 
    void displayValue()  std::cout << "The value is " << value; 
;

int main()

    auto instance std::make_unique<MyClass>(5) ;
    instance->displayValue();

当我运行代码分析时,我收到以下警告:

main.cpp(15):警告 C26486:不要将可能无效的指针传递给函数。对“MyClass::displayValue”的调用中的参数 0“@instance”可能无效(lifetime.3)。

谁能向我解释一下我应该如何在这里使用std::unique_ptr&lt;MyClass&gt; 来避免警告?

此外,我在 unique_ptr 的初始化中收到以下警告:

main.cpp(14):警告 C26414:移动、复制、重新分配或重置本地智能指针“实例”(r.5)。

我可以通过将std::make_unique 的用法包装在std::move 中来缓解这个问题,但我认为这没有必要。

编写此代码并避免我从代码分析器收到的警告的正确方法是什么?

【问题讨论】:

代码很好,只是缺少#include&lt;memory&gt;。它不应产生警告。 std::move 是多余的和悲观的。请逐字显示生成警告和其他警告的确切代码。 auto instance std::move(std::make_unique&lt;MyClass&gt;(5)) 应该是 auto instancestd::make_unique&lt;MyClass&gt;(5) auto instance = std::make_unique&lt;MyClass&gt;(5) 抱歉,#include&lt;utility&gt; 也不见了。 有时强制移动实际上对性能有害.. @walnut 我将按照建议添加包含指令。我还用关于第二个警告的详细信息更新了原始问题。 【参考方案1】:

响应警告 C26414

我收到了来自 Microsoft 的 Colin Robertson 通过 GitHub 的回复,其解释如下:

此案例属于备注部分的最后一个要点。除非您正在做一些需要保护 unique_ptr 的事情,否则将其声明为 MyClass 实例5;避免了一些不必要的开销。请记住,警告只是对一般规则的提醒。如果您的具体声明有充分的理由,请有足够的信心忽略它。

他的回复也可以在这里找到参考:

https://github.com/MicrosoftDocs/visualstudio-docs/issues/4711

所以,基本上,这里提醒我们,如果没有必要,不要使用堆分配。

响应警告 C26486

未答复。我已通过 GitHub 请求更多信息,正在等待回复。

2020 年 1 月 29 日更新 - 仍未得到答复。已向 Microsoft 开发人员社区提交问题

2020 年 2 月 3 日更新 - 收到来自 Visual Studio 社区(我认为是机器人?)的响应,将问题状态更新为“已分类”。我想这意味着他们正在优先考虑这个问题,也许?有兴趣的可以关注issuehere。

【讨论】:

这是第二个警告,对吧?第一个警告呢?对于第一个警告,鉴于您在此处显示的代码,它至少措辞错误。 @walnut 你是对的。我已经通过 GitHub 上的相同渠道提交了一个问题,正在等待回复。我将更新答案,以更清楚地说明正在回答哪个问题。 引用的回复令人失望,基本上是“为了避免我们产品中的这个错误,编写不同的代码”。 @M.M 该警告作为代码质量警告是有意义的。它正在执行this rule of the C++ core guidelines 中的执行建议,并且鉴于确实不需要堆分配,这是一个正确的警告。 @M.M 是的,OP 的问题没有很好地表述(现在更好了)。他们在问题的先前版本中添加了std::move 以使此警告静音,尽管警告的重点当然不是试图通过到处添加std::move 来使其静音,而是替换std::unique_ptr通过自动变量。在查看核心指南参考之前,警告文本的措辞并不是很有指导意义。

以上是关于Visual Studio Community 2019 中的 C++ 代码分析产生警告 C26486 和 C26414的主要内容,如果未能解决你的问题,请参考以下文章

2015版Visual Studio Code和Visual Studio Community的区别

Visual Studio community 开发者个人免费版安装教程

Visual Studio community 开发者个人免费版安装教程

Visual Studio 2010 Express 与 Community 2015 兼容?

Visual Studio community 开发者个人免费版安装教程

如何在 Visual Studio 2015 Community 中创建本地数据库?