C:何时使用变量或值?

时间:2014-10-21 10:11:17

标签: c casting warnings unused-variables

我正在清理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;
}

2 个答案:

答案 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,它也可以删除)