Coverity在局部变量的默认初始化时发出警告

Coverity在局部变量的默认初始化时发出警告,c,coverity,C,Coverity,有一种覆盖率警告类型:未使用的值。这由工具在“代码可维护性问题”下定义 未使用的_值:当一个变量被分配一个从函数调用返回的指针值,并且从未在源代码中的任何其他地方使用时,它不仅会导致资源使用效率低下,还会导致不确定的行为。该检查器识别程序中分配值后从未在其他地方使用的所有变量 这个检查器似乎也在收集一些好的编程实践作为警告 我的问题是,有没有更好的方法来做这些事情?或者应该忽略此类警告(并向Coverity团队报告任何可能的改进) 示例1:局部变量的默认初始化 int func() { i

有一种覆盖率警告类型:未使用的值。这由工具在“代码可维护性问题”下定义

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

这个检查器似乎也在收集一些好的编程实践作为警告

我的问题是,有没有更好的方法来做这些事情?或者应该忽略此类警告(并向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%的警告都是超自然的

为什么不这样做:

int retval = recvMessage();
还有这个

char * p = alloc_mem_wrapper();

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

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

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

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

printf("Status %d\n", status);
在上面,在顶部声明状态并在中间的代码更新后打印它是完全有意义的。但是,Coverity在此场景中不报告其未使用的值。它实际上抱怨以下代码

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);

上面,
步骤
可以只是一个范围变量。因此,覆盖错误更多地涉及范围,而不是初始化。

在这两种情况下,我都会考虑代码贫乏的样式,您正在做检查者正确指出的未使用的作业。“好的编程实践”是非常主观的。例如,如果定义变量时要做的第一件事是重新初始化它,那么您真的需要初始化它吗?现在,即使MSVC最终也支持C99样式的声明与C代码中的语句混合,一般来说,更好的处理方法是在需要声明变量的地方立即声明和初始化变量。如果使用一个编译器强制在块的开头声明所有变量,在我看来,即使是“无意义”的零初始化也可以。但是,如果您致力于使用Coverity,您可能希望相信它会告诉您未初始化变量的使用-它应该非常非常擅长这一点。普通编译器应该更擅长于此。对我来说,这看起来像是防御性编程,我认为你应该报告(至少第二个)为假阴性。第一个赋值,尽管是一种常见的做法,它是一个无意义的初始化(retval=SUCCESS)顺便说一句,我发现Coverity允许检查设置禁用此类警告,如果程序员认为它们在他的情况下是错误的:-未使用的值:报告覆盖的初始化器:-当此C/C++、C#和Java选项为真时,检查器将报告初始化变量的值在使用前被覆盖的情况。-未使用的_值:报告_未使用的_最终_赋值:-当此C/C++、C#和Java选项为true时,检查程序将报告为变量分配最终值的情况,但在变量超出范围之前从未使用该值。我认为警告是说“p=NULL”是未使用且无意义的赋值;这不是真的!