Использование -fsanitize = memory с clang в Linux с переполнением libstdStack

В системе, поставляемой libstdc ++, дезинфицирующее средство памяти clang практически невозможно использовать из-за ложных срабатываний — например, приведенный ниже код дает сбой.

#include <iostream>
#include <fstream>int main(int argc, char **argv)
{
double foo = 1.2;
std::ofstream out("/tmp/junk");
auto prev = out.flags(); //false positive here

out.setf(std::ios::scientific);
out << foo << std::endl;
out.setf(prev);
}

Сборка libstdc ++, как описано здесь:
https://code.google.com/p/memory-sanitizer/wiki/InstrumentingLibstdcxx

и работает так:

LD_LIBRARY_PATH=~/goog-gcc-4_8/build/src/.libs ./msan_example

дает следующий вывод

/usr/bin/llvm-symbolizer: symbol lookup error: /home/hal/goog-gcc-4_8/build/src/.libs/libstdc++.so.6: undefined symbol: __msan_init

Таким образом, и centos7 (epel clang), и ubuntu терпят неудачу.

Я что-то не так делаю?

Предыдущий вопрос переполнения стека Использование дезинфицирующего средства памяти с libstdc ++

редактировать
Используя предложение @eugins, скомпилируйте командную строку для этого кода:

clang ++ -std = c ++ 11 -fPIC -O3 -g -fsanitize = память -fsanitize-memory-track-originins -fPIE -fno-omit-frame-pointer -Wall -Werror -Xlinker —build-id -fsanitize = память -fPIE -pie -Wl, -rpath, / home / hal / goog-gcc-4_8 / build / src / .libs / libstdc ++. so test_msan.cpp -o test_msan

$ ./test_msan
==19027== WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x7f66df377d4e in main /home/hal/tradingsystems/test_msan.cpp:9
#1 0x7f66ddefaaf4 in __libc_start_main (/lib64/libc.so.6+0x21af4)
#2 0x7f66df37780c in _start (/home/hal/tradingsystems/test_msan+0x7380c)

Uninitialized value was created by an allocation of 'out' in the stack frame of function 'main'
#0 0x7f66df377900 in main /home/hal/tradingsystems/test_msan.cpp:6

SUMMARY: MemorySanitizer: use-of-uninitialized-value /home/hal/tradingsystems/test_msan.cpp:9 main
Exiting

1

Решение

MSan запускает процесс llvm-symbolizer для преобразования компьютеров трассировки стека в имена функций и номера файлов / строк. Из-за настройки LD_LIBRARY_PATH инструментированный libstdc ++ загружается как в основной процесс MSan (что хорошо), так и в процесс llvm-symbolizer (который не будет работать).

Предпочтительный способ работы с ним — настройка RPATH (во время соединения):

-Wl,-rpath,/path/to/libstdcxx_msan

Вы также можете проверить это руководство по msan / libc ++, которое является более подробным и актуальным:
https://code.google.com/p/memory-sanitizer/wiki/LibcxxHowTo

2

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


По вопросам рекламы [email protected]