Подтвердить что ты не робот

Почему нельзя запретить все дезинфицирующие средства?

Clang имеет различные дезинфицирующие средства, которые можно включить, чтобы ловить проблемы во время выполнения.
Однако есть некоторые дезинфицирующие средства, которые я не могу использовать вместе. Почему это?

clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=address -o main main.cpp                                                                                   1
clang: error: invalid argument '-fsanitize=address' not allowed with '-fsanitize=memory'

Это неважно, но когда я запускаю свои модульные тесты, это занимает больше времени, чем нужно, потому что я создаю несколько двоичных файлов для тех же тестов и запускаю каждый из них отдельно.

clang++-3.9 -std=c++1z -g -fsanitize=address -o test1 test.cpp
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=undefined  -o test2 test.cpp
4b9b3361

Ответ 1

Я думаю, проблема в том, что Asan и Msan хотят контролировать кучу, и оба хотят зарезервировать большой объем памяти для использования в качестве "теневой памяти", которая отслеживает распределения и использование памяти, используемой вашей программой.

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

Это также приведет к использованию сумасшедшей памяти, поскольку обе дезинфицирующие средства будут выделять дополнительную память для отслеживания каждого байт, который использует ваша программа.

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