CPPcheck的棘手情况

tricky situations with cppcheck

本文关键字:情况 CPPcheck      更新时间:2023-10-16

我面临着需要cppcheck才能通过的情况,但有时会变得棘手。在这种情况下,您通常会怎么做?例如。

#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=冗余分配 --enable='警告,样式,性能,可移植性" --inline-suppr --language='c++' retval_neverused.cpp 正在检查retval_neverused.cpp...[retval_neverused.cpp:13]:(样式)变量"retVal"被分配为 从不使用的值。

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

CppCheck 有点正确。 你根本不需要 retVal。 只需直接检查 fun2 的返回值:if( -1 == fun2() )

顺便说一句,在条件表达式中分配变量确实是一种不好的做法。 这使得捕获您打算键入==但实际上键入=的拼写错误变得更加困难。

你可以重写为:

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

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

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

一种常见的方法是这样:

#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