Dr Memory and the mysterious uninitialized read

时间:2015-04-23 05:19:58

标签: c++ dr-memory

The code below doesn't do anything interesting, but the mystery is why would Dr Memory think there's an unitialized read? Any ideas?

#include <memory>

int main(int argc, const char* argv[])
{
    int aa[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::unique_ptr<int[]> p {new int[10]};

    for (auto i = 0; i < 10; ++i) {
        p[i] = aa[i];
    }

    return 0;
} // <-- Dr Memory says UNINITIALIZED READ here

EDIT: Here's the full error details.

Error #1: UNINITIALIZED READ: reading 0x0028ff20-0x0028ff24 4 byte(s)
# 0 __mingw_glob                              [src/main.cpp:14]
# 1 _setargv                                  [src/main.cpp:14]
# 2 __mingw_CRTStartup
# 3 mainCRTStartup
# 4 ntdll.dll!RtlInitializeExceptionChain    +0x62     (0x772c8fe2 <ntdll.dll+0x38fe2>)
# 5 ntdll.dll!RtlInitializeExceptionChain    +0x35     (0x772c8fb5 <ntdll.dll+0x38fb5>)
Note: @0:00:00.297 in thread 9780
Note: instruction: cmp    (%esi) $0x0040a11e

1 个答案:

答案 0 :(得分:1)

main函数中指示的行不是发生错误的行。错误发生在__mingw_glob中,如堆栈跟踪所示,并且任何代码被调用之前发生。 (这是扩展在命令行上传递的文件名通配符的函数。在Linux上,这个工作由shell完成,但在Windows上由C Runtime负责。)

换句话说,它发生在mingw库中。这可能是无害的误报,你应该简单地添加一个排除。

我建议可能内存博士错误地将其识别为未初始化,因为它是在您的任何代码运行之前由操作系统初始化的,或者是在DrMemory初始化之前运行的代码,或者是因为它被传递给系统调用实际上并没有读取内存但只是写入内存。

为什么它在你的函数中显示错误的行?

默认情况下,调试器会尝试向您显示相关信息。由于您的代码通常更有可能是错误而不是库代码,因此调试器将在调用堆栈上显示代码的最新实例。例如,如果在对free的调用的特定于实现的深度中发生错误,则不太可能是库错误的库堆代码,因此将识别出名为free的代码可能是罪魁祸首。

在你的情况下,调用堆栈中没有你的代码,因此算法无法找到任何代码,并向你显示错误的位置。