Доктор Память и таинственное неинициализированное чтение

Приведенный ниже код не делает ничего интересного, но загадка заключается в том, почему доктор Память считает, что существует унифицированное чтение? Есть идеи?

#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

РЕДАКТИРОВАТЬ: Вот полная информация об ошибке.

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

5

Решение

Строка, указанная в вашем main Функция — это не строка, где произошла ошибка. Ошибка произошла в __mingw_glob как указано в трассировке стека, и это происходит до любой ваш код называется. (Это функция, которая расширяет подстановочные знаки имени файла, передаваемые в командной строке. В Linux эта работа выполняется оболочкой, но в Windows это ответственность C Runtime.)

Другими словами, это происходит в mingw библиотека. Вполне вероятно, что это безвредный ложноположительный результат, и вы должны просто добавить исключение.

Я полагаю, что, вероятно, доктор Память ошибочно определил это как неинициализированное, поскольку оно было инициализировано операционной системой до запуска любого вашего кода, или кодом, которое выполнялось до инициализации DrMemory, или потому что оно было передано системному вызову, который не Факт чтения памяти, но только пишет в него.

Почему он показывает неправильную строку в вашей функции?

Отладчики пытаются показать вам соответствующую информацию по умолчанию. Поскольку, как правило, гораздо более вероятно, что ваш код содержит ошибки, а не код библиотеки, отладчик покажет самый последний экземпляр вашего кода в стеке вызовов. Например, если ошибка возникает в специфических для реализации глубинах вызова free вряд ли это будет библиотечный код кучи, который виноват, так что вместо этого ваш код, который вызвал free будет определен как вероятный виновник.

В вашем случае в стеке вызовов нет вашего кода, поэтому алгоритм не может его найти и показывает вам ошибочное местоположение.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector