Xcode中的警告不正确?

时间:2015-10-11 02:59:28

标签: c++ xcode

以下代码在Xcode中的指示行上有警告 这个警告实际上是否有效? 如果这是一个有效的警告,那是怎么回事? 如果此警告不正确,是什么导致Xcode在此行上创建警告?

编辑:另外,为什么在警告发生的行上方的while循环中引用prevPtr时没有警告?

警告显示variable 'prevPtr' may be uninitialized when used here
它位于prevPtr->next = delPtr->next

我相信如果没有初始化变量,就不可能达到这条线。这会使这个警告毫无意义。

void myEditor::deleteLine(int num)
{
    Line *delPtr = head;

    if (delPtr == NULL) {
        return;
    }

    if (head->linenum == num) {
        head = head->next;
    }
    else {
        Line *prevPtr;

        while (delPtr != NULL && delPtr->linenum != num) {
            prevPtr = delPtr;
            delPtr = delPtr->next;
        }

        if (delPtr == NULL) {
            cout << "Line " << num << " does not exist." << endl;
        }
        else {
            prevPtr->next = delPtr->next; // warning appears here
        }
    }

    delete delPtr;
}

1 个答案:

答案 0 :(得分:3)

如果您使用Xcode中的“Product&gt; Analyze”菜单项,它会向您显示很多有关此类警告的详细信息。这是我尝试时得到的结果(在对Line的定义做出一些假设之后):

1. 'prevPtr' initialize to a null pointer value; 2. Loop body executed 0 times; 3. Access to field 'next' results in a dereference of a null pointer (loaded from variable 'prevPtr')

在这种情况下,这似乎是分析失败:编译器没有认识到,while循环运行零次,delPtr == NULL(这会导致早期返回)或delPtr->lineNum == num,暗示head->lineNum == num(这会导致else阻止无法运行。

话虽如此,读者并不清楚这段代码是否正确。建议重新构建代码以避免此警告。

关于您在编辑中添加的问题(“为什么在while循环中引用prevPtr时没有警告”):prevPtr仅分配给循环。它没有被解除引用,所以这不是错误。