Clang дезинфицирующее средство памяти; как заставить печатать номера исходных строк
Я собираю свою программу с clang++ -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g -O0
и когда я запускаю его, вывод:
matiu@matiu-laptop:~/projects/json++11/build$ ./tests
.......==10534== WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x7fe7602d4a51 (/home/matiu/projects/json++11/build/tests+0x106a51)
#1 0x7fe7602dfca6 (/home/matiu/projects/json++11/build/tests+0x111ca6)
...
#31 0x7fe75edbaec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
#32 0x7fe7602808dc (/home/matiu/projects/json++11/build/tests+0xb28dc)
Uninitialized value was created by a heap allocation
#0 0x7fe76026e7b3 (/home/matiu/projects/json++11/build/tests+0xa07b3)
#1 0x7fe7602ee7da (/home/matiu/projects/json++11/build/tests+0x1207da)
...
#18 0x7fe7602c1c4c (/home/matiu/projects/json++11/build/tests+0xf3c4c)
#19 0x7fe7602873fa (/home/matiu/projects/json++11/build/tests+0xb93fa)
SUMMARY: MemorySanitizer: use-of-uninitialized-value ??:0 ??
Exiting
Как сделать так, чтобы номера строк отображались, как в прекрасных примерах: http://clang.llvm.org/docs/MemorySanitizer.html
Я подозреваю, что это может быть невозможно из-за того, что моя прагма - одна гигантская вложенная лямбда: https://github.com/matiu2/json--11/blob/master/tests.cpp
1 ответ
С помощью средства для удаления адресов я заметил, что мне нужно определить следующие переменные среды:
ASAN_OPTIONS=symbolize=1
(требуется только при компиляции с GCC > 4.8) иASAN_SYMBOLIZER_PATH=$(which llvm-symbolizer)
Я думаю, что символизатор - это то, что вы ищете. Он преобразует символы в имена файлов с номерами строк и столбцами.
На веб-сайте проекта очистки памяти написано:
символизация
Задайте для переменной среды MSAN_SYMBOLIZER_PATH путь к двоичному файлу llvm-symbolizer (обычно создается с помощью LLVM). MemorySanitizer будет использовать его для символизации отчетов на лету.
Так вам нужно MSAN_SYMBOLIZER_PATH
быть установленным аналогично ASAN_SYMBOLIZER_PATH
,