CPPcheck的棘手情况
tricky situations with cppcheck
我面临着需要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
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- Cppcheck生成xml转储文件
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- cppcheck在const std::string[]上引发警告
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- CPPcheck的棘手情况