【问题标题】:Visual Studio 2013 not displaying unreferenced variable warningsVisual Studio 2013 不显示未引用的变量警告
【发布时间】:2016-07-12 19:21:09
【问题描述】:

我在 Visual Studio 2013 中构建,如果我向函数添加未引用的变量,编译器不会抛出关于它们的警告。我尝试根据这个线程启用代码分析: Visual Studio 2013 Compiler Warnings not Showing 但这仍然没有解决我的问题。一些附加信息:

  • 我已将警告级别设置为 3 (/W3),将警告视为错误 (/WX),并且处于未启用优化的调试版本中。

  • 我从项目 -> 属性 -> 配置属性 -> C/C++ -> 命令行的完整命令行是: /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /Fd"generated\debug\intermediate\vc120.pdb" /fp:precise /D "WIN32" /D "GLEW_STATIC" /D "_D​​EBUG" / D "_WINDOWS" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /errorReport:prompt /WX /Zc:forScope /RTC1 /Gd /Oy- /MTd /Fa"generated\debug\intermediate\" /EHsc /nologo / Fo"生成\调试\中间\" /Fp"生成\调试\中间\blahDebug.pch"

  • 我正在迭代一个我不断调试的函数,单步执行代码等等——所以我知道代码正在运行。但如果我抛出“int blah = 1;”在函数中并重新编译,不会产生任何警告。

示例代码:

bool MyClass::doSomething(int someParameter)
{
    int blah = 1;
    // run the normal function logic here
    // 'someParameter' is referenced, but 'blah' never is.
    // when i compile, i receive no warning that 'blah' is unreferenced.
    return true;
}

【问题讨论】:

  • 你到底想得到什么? unreferenced local variablesunreferenced parameters 之间存在差异。前者是 3 级警告,而后者是 4 级警告。请发布演示您的问题的代码
  • 谢谢,瑞恩。我添加了一些示例代码。我对未引用的局部变量(C4101)感兴趣。我尝试添加显式调用:#pragma warning(default : 4101) 以及各种警告级别,但这没有任何区别。
  • 我想知道声明中的赋值是否算作“引用”变量。如果将行更改为 int blah; 会引发错误吗?不幸的是,我现在没有可用的 VS 安装。
  • 嗯,你是对的!如果我删除分配并离开int blah;,则会引发警告。我不确定这是否是预期的行为。尽管 MSDN 上的示例也没有初始化,但它无法检测到尽管初始化但无法检测到使用不足,这对我来说似乎有点疯狂:msdn.microsoft.com/en-us/library/c733d5h9(v=vs.120).aspx
  • 这是有意的,因为初始化不是赋值,所以您使用 int 构造函数创建 blah,然后在 operator= 调用中使用 blah。不是你可能在想的只是在创造废话。使用int blah{1}; 看看是否有区别。我不记得 C++ 是否有 int blah(1); 但这本质上是一样的。

标签: c++ visual-studio-2013 compiler-warnings


【解决方案1】:

在您的示例代码中,int blah = 1; 语句既声明了变量,也为其赋值。 Visual Studio 将此赋值计为变量的“引用”,从而避免了您所期望的 C4101 unreferenced local variable 错误。

要定位和删除已初始化但从未使用过的变量,您可以使用静态分析工具,例如 Prefast 或 CppCheck。有一个这样的工具列表here,虽然它可能已经过时了。

请注意,编译器可以标记未使用的参数,即使它们是使用默认参数初始化的。如果您通过/W4/Wall 使用警告级别4,则未使用的参数将导致C4100 unreferenced parameter 警告。始终使用/W4/Wall 而不是默认的/W3 构建是一个非常好的主意。

【讨论】:

    【解决方案2】:

    正如 Ryan Bemrose 所述,静态代码分析工具可用于检测源代码中未使用的资源。

    看看下面的函数:

    bool foo(int unusedParameter)
    {
      int unusedVariable = 1;
      return true;
    }
    

    它包含两个未使用的资源,一个未使用的参数和一个未使用但已初始化的局部变量。 Cppcheck 可以通过以下命令帮助您检测未使用的局部变量:

    $ cppcheck --enable=all test.cpp 
      Checking test.cpp...
      [test.cpp:3]: (style) Variable 'unusedVariable' is assigned a value that is never used.
    

    目前它不检测未使用的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      相关资源
      最近更新 更多