2016-05-01 10 views
10

ma różne środki dezynfekujące, które można włączyć, aby złapać problemy w czasie wykonywania.
Istnieje jednak kilka środków odkażających, których nie mogę używać razem. Dlaczego?Dlaczego nie można włączyć wszystkich środków do dezynfekcji?

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' 

To nie jest wielka sprawa, ale gdy uruchomię moich testów jednostkowych, to trwa dłużej niż powinno, bo mam utworzyć wiele plików binarnych dla tych samych testów i uruchomić każdy z nich oddzielnie.

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

Zgaduję, że niektóre oprzyrządowanie jest po prostu niezgodne - np. oprzyrządowanie do jednego odkażacza dawałoby fałszywe alarmy lub fałszywe negatywy w drugim. Ale byłbym bardzo zainteresowany szczegółami technicznymi. – MikeMB

+1

"kiedy przeprowadzam testy jednostkowe, to trwa to dłużej niż powinno" -> wygląda na to, że nie używasz '-O". '-O1' jest bezpieczny w użyciu z dezynfekcją pamięci i nie uszkadza tropów stacków (oprócz wywołań) – viraptor

+0

@viraptor Dzięki, to jest dobra uwaga. Miałem również na myśli faktyczny czas kompilacji. Budowanie wielu plików binarnych w celu testowania tych samych składników oprogramowania. –

Odpowiedz

2

Myślę, że problemem jest to, że Asan i MSAN zarówno chcą kontrolować sterty i obie chcą zarezerwować dużą ilość pamięci do wykorzystania jako „pamięć cienia”, który śledzi przydziałów i ich użycie pamięci program używa.

Nie mogą one być jednocześnie aktywne, ponieważ próbują śledzić pamięć używaną przez inny środek dezynfekujący (który może nie wydawać się "bezpieczny" zgodnie z zasadami, które sprawdza sanityzer).

Spowodowałoby to również zwariowane zużycie pamięci, ponieważ oba środki odkażające przeznaczałyby dodatkową pamięć do śledzenia każdego bajtu używanego przez program.

Może teoretycznie można je przeprojektować tak, by dzieliły wspólne ramy, aby mogły współpracować i nie kolidować, ale prawdopodobnie istnieją bardzo dobre praktyczne powody, dla których byłoby to trudne lub szkodziło wydajności.

Powiązane problemy