我正在清理Coverity问题中的一些代码,并且有一种情况,即早期使用函数的本地指针是一个用于比较的函数,然后将它分配给指向其他位置,但它永远不会引用或用于为其值赋值。 Coverity说它是一个未使用的指针值 - 所以我想将它强制转换为void以指示在该点之后没有使用指针。我想知道什么时候考虑在程序中使用的值或变量?这是一个代码示例,解释了我的情况:
在下面的示例中,Coverity会将fltr_ptr标记为在样本结束时的两次分配后未使用
int initialise (void)
{
// pointer first decalred and defined
FILTER_PTR fltr_ptr = NULL;
// pointer given valid value
fltr_ptr = global_val->filter_group[index];
// second use of fltr_ptr
if ( TRUE == fltr_ptr -> being_used)
{
// first use of fltr_ptr
if ( TRUE != close_filter ( fltr_ptr -> Filter)
{
// print error
}
// do more code
// fltr_ptr assigned first time , value not used should it be (void)fltr_ptr?
fltr_ptr = Free_Memory (fltr_ptr, sizeof(FILTER_PTR));
}
else
{
return 1;
}
for ( number of iterations )
{
// fltr_ptr assigned again but value not used should it be (void)fltr_ptr?
fltr_ptr = global_val->filter_group[index];
}
return 0;
}
答案 0 :(得分:4)
Coverity指向您在上一个fltr_ptr
循环中分配给for
,但您对此值不做任何操作。为什么要分配?转换为void可能会修复警告,但要修复的第一件事应该是以某种方式使用指针,或者停止分配它。
答案 1 :(得分:1)
要回答标题问题,当“它被初始化或分配给然后被处理而不被阅读时,变量被视为未使用。”
int main()
{
int i;
int j = 1; // both i and j are unused at this point
int i = j * 2; // j is now 'used', the new value of i is unused
printf("%d",j);//j is used again
} // i goes out of scope without being used.
请注意,该定义也不是“如果将其分配给未经阅读”,因为这表明以下内容存在问题:
unsigned int find_max_index(int a[], int size)
{
unsigned int i;
unsigned int maxval = 0;
unsigned int maxindex = 0;
for (i = 0; i< size; i++){
if (a[i]>maxval){
maxval = a[i];
maxindex = i;
}
}
return maxindex;
}
在此代码中,maxindex
可以多次分配而不被阅读。
回顾我的原始示例,我们可以在不对程序进行任何更改的情况下消除i
。这降低了程序的复杂性,消除了冗余操作(尽管编译器也应该在优化时执行此操作)并减少程序员错误的可能性:
//FUNCTIONALLY THE SAME AND SIMPLER
int main()
{
int j = 1; // j is unused at this point
printf("%d",j);// j is used
}
以同样的方式,您可以删除整个循环:
for ( number of iterations )
{
// fltr_ptr assigned again but value not used should it be (void)fltr_ptr?
fltr_ptr = global_val->filter_group[index];
}
(你删除了赋值并得到一个空循环。因为这是一个很长的nop,它也可以删除)