2015-01-15 9 views
3

내 단위 테스트 코드는 모두 boost::test을 기반으로합니다. 난 그냥 소독제 GCC 주소를 시도하고 그것은 부스트 ​​:: 테스트 몇 가지 문제를보고GCC 주소 Sanitizer - 라이브러리 기능 블랙리스트 (특히 boost :: test)

==25309==ERROR: AddressSanitizer: heap-use-after-free on address 0xf5801344 at pc 0x8259412 bp 0xff9966c8 sp 0xff9966bc 
READ of size 4 at 0xf5801344 thread T0 
#0 0x8259411 in boost::unit_test::framework::run(unsigned long, bool)  ../common/lib/boost/boost/test/impl/framework.ipp:450 
#1 0x82732f7 in boost::unit_test::unit_test_main(bool (*)(), int, char**) ../common/lib/boost/boost/test/impl/unit_test_main.ipp:185 
#2 0x827b5a3 in main ../common/lib/boost/boost/test/unit_test.hpp:59 
#3 0x213ce5 in __libc_start_main (/lib/libc.so.6+0x16ce5) 
#4 0x8238680 (/home/marpashl/lte/sw/build/x86/bin/framework_unit_test+0x8238680) 

(이 테스트 라이브러리에 알려진 에러처럼) 나는이 메시지를 숨길 싶습니다 그래서 나는 단지 내 코드 내의 문제를 참조하십시오.

GCC에서이 작업을 수행 할 수있는 방법이 있습니까?

주 컴파일러 버전의 GCC :

/opt/gcc-x86-4.9.2/bin/c++ 나는 꽝 파일이 -fsanitize-blacklist=blacklist.txt을 사용하여 블랙리스트 할 수 있지만 함께이 현재 GCC를 사용할 수 없습니다 것을 발견했다.

그것은 연타 (3.3 이상) 및 GCC가 지원하는 경우 : 살균 - 블랙리스트를 사용할 수없는,하지만 당신은 소스 코드에 액세스 할 수있는 경우

+0

테스트 라이브러리를 컴파일하는 동안 다른 CFLAGS를 설정할 수 있습니까? 이렇게하면 전체 라이브러리 (framework :: run 함수뿐만 아니라)가 제외되지만 적어도 프로그램을 실행할 수는 있습니다. – Sjlver

+0

좋은 제안이지만 우리의 단위 테스트는 현재 별도의 라이브러리에 대한 링크가 아니라 헤더 파일을 통한 boost :: test를 사용합니다. – mark

답변

3

, 당신은 함수 속성을 사용하여 소독되는 개별 기능을 제외 할 수 있습니다 (4.8+). 다음 매크로를 정의 할 수 있습니다.

#if defined(__clang__) || defined (__GNUC__) 
# define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) 
#else 
# define ATTRIBUTE_NO_SANITIZE_ADDRESS 
#endif 
... 
ATTRIBUTE_NO_SANITIZE_ADDRESS 
void ThisFunctionWillNotBeInstrumented() {...} 

자세한 내용은 this page을 참조하십시오.