Visual Leak Detector сообщает о странных утечках в CRT-модуле VC++

Я только что установил Visual Leak Detector (2.3) в Windows 8. Я протестировал его с пустой программой CRT (в Visual Studio 2012), которая ничего не делает.

#include <vld.h>

int main(int argc, char** argv) 
{
    return 0;
}

Когда я запускаю его, VLD сообщает о странных утечках в модуле vC++ crt:

Visual Leak Detector Version 2.3 installed.
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 31 at 0x0000000052C07530: 70 bytes ----------
  Call Stack:
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\stdenvp.c (127): my_application.exe!_setenvp + 0x27 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (223): my_application.exe!__tmainCRTStartup + 0x5 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (164): my_application.exe!mainCRTStartup
    0x00000000FAF8167E (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0x1A bytes
    0x00000000FD8CC3F1 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    20 B5 C0 52    50 00 00 00    50 92 C0 52    50 00 00 00     ...RP... P..RP...
    20 91 DD E1    F6 07 00 00    7E 00 00 00    02 00 00 00     ........ ~.......
    12 00 00 00    00 00 00 00    1F 00 00 00    FD FD FD FD     ........ ........
    50 52 4F 43    45 53 53 4F    52 5F 4C 45    56 45 4C 3D     PROCESSO R_LEVEL=
    36 00 FD FD    FD FD                                         6....... ........


---------- Block 40 at 0x0000000052C075D0: 72 bytes ----------
  Call Stack:
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\stdenvp.c (127): my_application.exe!_setenvp + 0x27 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (223): my_application.exe!__tmainCRTStartup + 0x5 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (164): my_application.exe!mainCRTStartup
    0x00000000FAF8167E (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0x1A bytes
    0x00000000FD8CC3F1 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    F0 94 C0 52    50 00 00 00    20 76 C0 52    50 00 00 00     ...RP... .v.RP...
    20 91 DD E1    F6 07 00 00    7E 00 00 00    02 00 00 00     ........ ~.......
    14 00 00 00    00 00 00 00    28 00 00 00    FD FD FD FD     ........ (.......
    53 45 53 53    49 4F 4E 4E    41 4D 45 3D    43 6F 6E 73     SESSIONN AME=Cons
    6F 6C 65 00    FD FD FD FD                                   ole..... ........


---------- Block 41 at 0x0000000052C07620: 67 bytes ----------
  Call Stack:
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\stdenvp.c (127): my_application.exe!_setenvp + 0x27 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (223): my_application.exe!__tmainCRTStartup + 0x5 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (164): my_application.exe!mainCRTStartup
    0x00000000FAF8167E (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0x1A bytes
    0x00000000FD8CC3F1 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    D0 75 C0 52    50 00 00 00    D0 96 C0 52    50 00 00 00     .u.RP... ...RP...
    20 91 DD E1    F6 07 00 00    7E 00 00 00    02 00 00 00     ........ ~.......
    0F 00 00 00    00 00 00 00    29 00 00 00    FD FD FD FD     ........ ).......
    53 79 73 74    65 6D 44 72    69 76 65 3D    43 3A 00 FD     SystemDr ive=C:..
    FD FD FD                                                     ........ ........


---------- Block 43 at 0x0000000052C07670: 65 bytes ----------
  Call Stack:
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\stdenvp.c (127): my_application.exe!_setenvp + 0x27 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (223): my_application.exe!__tmainCRTStartup + 0x5 bytes
    f:\dd\vctools\crt_bld\self_64_amd64\crt\src\crt0.c (164): my_application.exe!mainCRTStartup
    0x00000000FAF8167E (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0x1A bytes
    0x00000000FD8CC3F1 (File and line number not available): ntdll.dll!RtlUserThreadStart + 0x21 bytes
  Data:
    D0 96 C0 52    50 00 00 00    C0 76 C0 52    50 00 00 00     ...RP... .v.RP...
    20 91 DD E1    F6 07 00 00    7E 00 00 00    02 00 00 00     ........ ~.......
    0D 00 00 00    00 00 00 00    2B 00 00 00    FD FD FD FD     ........ +.......
    54 45 4D 50    3D 46 3A 5C    54 45 4D 50    00 FD FD FD     TEMP=F:\ TEMP....
    FD                                                           ........ ........


Visual Leak Detector detected 48 memory leaks (6044 bytes).
Largest number used: 15094 bytes.
Total allocations: 25276 bytes.
Visual Leak Detector is now exiting.

В сети не так много подробностей об этом, однако на этом форуме msdn комментарий гласит:

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

Тем не менее, я хочу, чтобы эти строки не появлялись в отчете (если они действительно не являются утечками)

Кто-нибудь сталкивался с этим и знает, как разобраться?

2 ответа

Решение

Я обнаружил, что это ошибка в VLD 2.3. Подробности ошибки здесь. Я только что скачал v2.4rc2 (vld-2.4rc2-setup.exe), и эта проблема больше не появляется. (Я скачал v2.3, потому что он был отмечен как стабильный)

Самым простым решением, по-видимому, является добавление StartDisabled=yes в файле vld.ini, а затем явно включить его из первой строки main(), Конечно, вы также пропустите "утечки памяти" из ваших глобальных объектов, но это, как правило, одинаково безвредно.

Другие вопросы по тегам