【问题标题】:tricky situations with cppcheckcppcheck 的棘手情况
【发布时间】:2019-01-03 17:07:45
【问题描述】:

我面临需要通过 cppchecks 的情况,但有时会变得棘手。在这种情况下你一般会怎么做? 例如。

#include<iostream>
using namespace std;
void fun1();
int fun2();
int main()
{
        fun1();
}

void fun1()
{
        int retVal;
        if (-1 == (retVal = fun2()))
        {
                cout <<"Failure. fun2 returned a -1"<< endl;
        }
}

int fun2()
{
        return -1;
}

我们通常会看到类似上面的代码。上述文件的 cppcheck 将给出如下输出 -

cppcheck --suppress=redundantAssignment --enable='warning,style,performance,portability' --inline-suppr --language='c++' retval_neverused.cpp 检查 retval_neverused.cpp... [retval_neverused.cpp:13]: (style) 变量 'retVal'被分配了一个 从未使用过的值。

我不想仅仅为了 cppcheck 而添加一些虚拟行打印 retVal。事实上,这可能是我抛出异常并且我不希望异常包含一些微不足道的东西作为 retVal 的值。

【问题讨论】:

  • 我没有得到 Q。您在分配值后不要使用 retVal,因此诊断是正确的。现在你可以将代码重写为void fun1() { if (-1 == fun2()) { cout &lt;&lt;"Failure. fun2 returned a -1"&lt;&lt; endl; } }

标签: c++ cppcheck


【解决方案1】:

CppCheck 是对的。你根本不需要 retVal。直接查看fun2的返回值即可:if( -1 == fun2() )

顺便说一句,在条件表达式中分配变量是非常糟糕的做法。这让你更难发现你想输入==但实际上输入了=的错别字。

【讨论】:

    【解决方案2】:

    你可以改写为:

    const int retval = fun2();
    if (retval == -1)
    

    恕我直言,这种技术更易于调试,因为您可以使用调试器查看在执行if 语句之前从fun2 返回的值。

    使用if 表达式中的函数调用进行调试,查看函数的返回值会稍微复杂一些。

    【讨论】:

      【解决方案3】:

      一种常见的方法是这样的:

      #define OK_UNUSED(x) (void)x
      
      
      void fun1()
      {
              int retVal;
              if (-1 == (retVal = fun2()))
              {
                      OK_UNUSED (retVal);
                      cout <<"Failure. fun2 returned a -1"<< endl;
              }
      }
      

      这向人类表明 retVal 是故意未使用的,并使 CppCheck 认为它已被使用,从而抑制警告。

      请注意,如果评估其参数会产生后果,则不应使用此宏。在这种情况下,您需要一些更高级的东西,例如:

      #define OK_UNUSED(x) if(false && (x)) ; else (void) 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 2023-03-16
        • 2021-07-17
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多