cppcheck 的棘手情况
tricky situations with 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='warning,style,performance,portability' --inline-suppr --language='c++' retval_neverused.cpp Checking retval_neverused.cpp... [retval_neverused.cpp:13]: (style) Variable 'retVal' is assigned a
value that is never used.
我不想为了 cppcheck 添加一些虚拟行打印 retVal。事实上,这可能是我抛出异常并且我不希望异常具有一些微不足道的东西作为其中的 retVal 值的情况。
CppCheck 有点正确。你根本不需要 retVal 。直接检查 fun2
的 return 值:if( -1 == fun2() )
顺便说一句,在条件表达式中分配变量是非常糟糕的做法。这使得在您打算键入 ==
但实际键入 =
.
的地方更难发现拼写错误
您可以重写为:
const int retval = fun2();
if (retval == -1)
恕我直言,此技术更易于调试,因为您可以使用调试器看到在执行 if
语句之前从 fun2
编辑的值 return。
使用 if
表达式中的函数调用进行调试要从函数中查看 return 值稍微复杂一些。
一种常见的方法是这样的:
#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
我面临着需要 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 Checking retval_neverused.cpp... [retval_neverused.cpp:13]: (style) Variable 'retVal' is assigned a value that is never used.
我不想为了 cppcheck 添加一些虚拟行打印 retVal。事实上,这可能是我抛出异常并且我不希望异常具有一些微不足道的东西作为其中的 retVal 值的情况。
CppCheck 有点正确。你根本不需要 retVal 。直接检查 fun2
的 return 值:if( -1 == fun2() )
顺便说一句,在条件表达式中分配变量是非常糟糕的做法。这使得在您打算键入 ==
但实际键入 =
.
您可以重写为:
const int retval = fun2();
if (retval == -1)
恕我直言,此技术更易于调试,因为您可以使用调试器看到在执行 if
语句之前从 fun2
编辑的值 return。
使用 if
表达式中的函数调用进行调试要从函数中查看 return 值稍微复杂一些。
一种常见的方法是这样的:
#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