cppcheck的棘手情况

时间:2019-01-03 17:07:46

标签: c++ cppcheck

我正面临需要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 ='警告,样式,性能,便携性'--inline-suppr --language ='c ++'retval_neverused.cpp检查retval_neverused.cpp ... [retval_neverused.cpp:13]:(样式)变量'retVal'被分配了一个   从未使用过的值。

我不想仅仅为了cppcheck而添加一些虚拟行打印retVal。实际上,这可能是我抛出异常并且不希望异常中包含retVal的值的琐碎情况。

3 个答案:

答案 0 :(得分:5)

CppCheck虽然还不错。您根本不需要retVal。只需直接检查fun2的返回值即可:if( -1 == fun2() )

顺便说一句,在条件表达式中分配变量确实是一种不好的做法。在原本要输入==但实际上要输入=的地方输入错字会变得更加困难。

答案 1 :(得分:4)

您可以改写为:

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

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

使用if表达式中的函数调用进行调试要复杂些,以查看该函数的返回值。

答案 2 :(得分:2)

一种常见的方式是使用类似这样的东西:

#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