2016-05-01 14 views
10

Clang có nhiều chất khử trùng khác nhau có thể được bật để phát hiện sự cố khi chạy.
Tuy nhiên, có một số chất khử trùng mà tôi không thể sử dụng cùng nhau. Tại sao vậy?Tại sao bạn không thể kích hoạt tất cả các chất vệ sinh?

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' 

Đó không phải là vấn đề lớn, nhưng khi chạy thử nghiệm đơn vị, phải mất nhiều thời gian hơn, vì tôi đã tạo nhiều tệp nhị phân cho cùng một thử nghiệm và chạy riêng từng thử nghiệm.

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

Tôi đoán là, một số thiết bị đo đạc không tương thích - ví dụ: thiết bị đo đạc cho một chất khử trùng sẽ dẫn đến kết quả dương tính giả hoặc âm tính sai ở một chất khử trùng khác. Nhưng tôi cũng rất quan tâm đến các chi tiết kỹ thuật. – MikeMB

+1

"khi tôi chạy thử nghiệm đơn vị của mình, phải mất nhiều thời gian hơn" -> có vẻ như bạn không sử dụng '-O'. '-O1' là an toàn để sử dụng với bộ khử trùng bộ nhớ và sẽ không làm hỏng stacktraces (ngoài đuôi gọi) – viraptor

+0

@ viraptor Cảm ơn, đó là một điểm tốt. Tôi đã đề cập đến thời gian biên dịch thực tế. Xây dựng nhiều tệp nhị phân để kiểm tra các thành phần phần mềm giống nhau. –

Trả lời

2

Tôi nghĩ vấn đề là cả Asan và Msan đều muốn kiểm soát heap, và cả hai đều muốn dành một lượng lớn bộ nhớ để sử dụng như "bộ nhớ bóng" theo dõi phân bổ và sử dụng bộ nhớ chương trình sử dụng.

Cả hai đều không thể hoạt động vì chúng sẽ cố gắng theo dõi bộ nhớ đang được sử dụng bởi các chất khử trùng khác (có thể có vẻ không an toàn) theo các quy tắc mà vệ sinh kiểm tra).

Nó cũng sẽ dẫn đến việc sử dụng bộ nhớ điên, vì cả hai trình khử trùng sẽ phân bổ bộ nhớ bổ sung để theo dõi từng byte mà chương trình của bạn sử dụng. Có lẽ theo lý thuyết, họ có thể được tái thiết kế để chia sẻ một khung chung để họ có thể hợp tác và không đụng độ, nhưng có lẽ những lý do thực tế rất tốt tại sao điều đó sẽ khó, hoặc làm tổn thương hiệu suất.

Các vấn đề liên quan