Это простая проблема для воспроизведения. Мой старый друг, Address Sanitizer, который всегда был очень надежным, не сообщает об утечках в моей среде WSL 1.
❯ cat main.cpp
#include <cstring>
#include <iostream>
int main()
{
auto p = new char[128];
std::strcpy(p, "Hello, world!\n" );
std::cout << p;
return 0;
}
g++ -O0 -g -fsanitize=address main.cpp
❯ ./a.out
Hello, world!
❯
Это работает, ничего не сообщая, во всех моих обычных средах * IX всегда сообщается, что протечь. Различные другие попытки заставить его сообщить об утечке не удаются.
Я знаю, что дезинфицирующее средство есть и, по крайней мере, сторона работает, потому что я могу заставить его сообщать о таких вещах, как двойное удаление, несоответствие между версиями массива new / удалите как положено.
Мои версии:
❯ clang++ --version
clang version 9.0.0-2~ubuntu18.04.1 (tags/RELEASE_900/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
❯ g++ --version
g++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Я пробовал переключать версии clang и g cc без какого-либо эффекта. Кажется, не имеет никакого значения, собираю ли я с помощью clang ++ или g ++.
Похоже, это должно быть простой проблемой конфигурации, но я не смог Google найти свой путь к успеху.
Мне кажется, что проблема в том, что WSL 1 предоставляет несовершенный слой прокладок для управления системной памятью. Но это над моей головой.