3

有一个覆盖警告类型:UNUSED_VALUE。这是由“代码可维护性问题”下的工具定义的

UNUSED_VALUE:当一个变量被分配一个从函数调用返回的指针值并且从未在源代码的其他任何地方使用时,它不仅会导致资源使用效率低下,而且还会导致不确定的行为。该检查器识别所有变量,这些变量在分配给它们后从未在程序中的其他任何地方使用过。

该检查器似乎也将一些良好的编程习惯作为警告。

我的问题是有没有更好的方法来做这些事情?还是应该忽略这样的警告(并向 Coverity 团队报告任何可能的改进)?

示例 1:局部变量的默认初始化

int func()
{
   int retval = SUCCESS;  //COVERITY says: Unused value     (UNUSED_VALUE)assigned_value: Value SUCCESS is assigned to retval here, but that     stored value is not used before it is overwritten

   retval = recvMessage();  //COVERITY says: value_overwrite: Value SUCCESS     is overwritten with value fromrecvMessage

   ....

}

示例 2:释放内存后将指针设置为 NULL

void func2()
    {
       char *p = NULL;
       ....
       p = alloc_mem_wrapper();
       ... do something
       free_mem_wrapper(p);
       p = NULL; //Coverity says: Unused value (UNUSED_VALUE)assigned_pointer: Value NULL is assigned to p here, but that stored value is not used    
       ... do rest of the job (p is not used again)
    }

就我而言,所有警告中的 90% 仅属于上述性质!

4

2 回答 2

0

为什么不这样做:

int retval = recvMessage();

和这个

char * p = alloc_mem_wrapper();

(大多数情况下)如果你不知道如何初始化一个你可能不需要的变量(你定义它的地方)。

于 2015-06-11T08:08:16.967 回答
0

以上所有建议都很好,但仍然有人偶然发现此错误并将其视为问题。我猜人们将它与违反良好实践联系起来,因为他们认为它会出现在以下场景中

int status = -1;
char c = getch();

switch(c){
    case 'w': {
        status = walk();
    }
    break;
    case 's': {
        status = sit();
    }
    break;
}

printf("Status %d\n", status);

上面,在上面声明状态并在中间的代码更新后打印它是完全有意义的。但是,在这种情况下,Coverity 不会报告它 UNUSED_VALUE。它实际上抱怨以下代码

int status = -1;
int steps = 0;
char c = getch();

switch(c){
    case 'w': {
        status = walk();
        steps = get_steps();
        status = (steps > 0)?status:-1;
    }
    break;
    case 's': {
        status = sit();
    }
    break;
}

printf("Status %d\n", status);

上面,steps可以简单地是一个范围变量。因此,Coverity 错误与范围有关,而不是与初始化有关。

于 2020-03-23T21:36:36.653 回答