c++ - Xcode 中的警告不正确?

标签 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;
}

最佳答案

如果您在 Xcode 中使用“Product > 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 block 不运行)。

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


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

关于c++ - Xcode 中的警告不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33061108/

相关文章:

swift - NStableView 不显示我的数据

遍历 vector 时出现 C++ 段错误

c++ - 隐藏 QGraphicsItem 超出边界的区域

ios - 如何在 iOS 中通过套接字从服务器接收数据?

xcode - 在 Xcode 5 中旋转 Storyboard View Controller

iphone - 释放 NSURLConnection 对象

objective-c - 关于释放属于另一个对象的对象 - xcode 内存管理

c++ - 在一种方法中使用两个 boost 互斥体?

c++ - 比较从同一确切源构建的两个可执行文件的校验和

c# - 如何取消设置整数中的特定位