понедельник, 4 марта 2019 г.

Address/memory/thread sanitizer.


Попробовал address/memory/thread sanitizer, очень заинтересовали данные штуки, ибо работают намного шустрее valgrind'а. Работаю в среде Qt, поэтому всё далее будет применительно к ней

Address sanitizer.

Во все pro файлы добавляем строки
QMAKE_CXXFLAGS += -fsanitize=address
QMAKE_LFLAGS += -fsanitize=address

Первое — флаг компиляции, второе — флаг линковки.

Теперь собираем проект и запускаем. Лучше запускать в консоли, тогда будет разноцветный вывод, который будет показывать ошибки. Разницы в выводе при сборке в debug и в release версии не увидел, по-видимому ошибки будут показаны не в какой инструкции, а лишь в какой функции, что огорчает, но это лучше, чем ничего.

При возникновении ошибки приложение упадёт и в логе мы увидим описание ошибки.

Thread sanitizer.

Во все pro файлы добавляем строки
QMAKE_CXXFLAGS += -fsanitize=thread
QMAKE_LFLAGS += -fsanitize=thread
QMAKE_CXXFLAGS += -fPIE
QMAKE_LFLAGS += -fPIE
QMAKE_CXXFLAGS += -pie
QMAKE_LFLAGS += -pie

Собираем проект и запускаем, всё аналогично предыдущему. У нас в проекте сразу полетели ошибки data race, но я пока не смог разобраться, как анализировать полученные логи (там есть красные, синие, жёлтые, зелёные и прочих цветов сообщения, пока даже понять, какие именно потоки race'ятся не ясно).

Ну и напоследок memory sanitizer.

Во все pro файлы добавил строки

QMAKE_CXXFLAGS += -fsanitize=memory
QMAKE_LFLAGS += -fsanitize=memory
и получил ошибку:
error: unrecognized argument to -fsanitize= option: 'memory'

Вопрос — как собраться с этим санитайзером? Пока непонятно.

Комментариев нет:

Отправить комментарий