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

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

Ответ 1

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

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

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

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