2017-04-13 6 views
3

다음 코드 단편에는 사소하지 않은 오류가 있지만 AddressSanitizer와 같은 도구가이를 catch 할 것으로 예상됩니다.std :: vector 수동 중독

벡터를 스킵하고 범위 외부에서 인쇄 할 때 캐치 참조에 오류가 발생하면 use-heap-after-free가 발생합니다.

범위가없는 경우 std :: vector 구현은 아마도 pop_back 이후의 메모리를 해제하지 않으므로 참조가 여전히 유효한 메모리를 가리키고 있습니다.

나는 주위를 검색하고 난 이것이 STL 라이브러리에서 구현 된 경우 당신은 내가 수동으로 독 메모리를 궁금 수 있다는 것을 발견 이것은 연타의 libc의 ++과 된 libstdc 구글의 지점 ++ (구현 된 (https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning)

+0

아마도 런타임 라이브러리 중 하나가 디버그 빌드에서이 작업을 수행합니다. 그러나 나는 "당신이 필요로하는 것에 대해서만 지불하는"원칙에 위배되기 때문에 이것을 릴리스 빌드에서 기대하지 않을 것입니다. –

답변

3

자세한 내용은 Asan wiki 참조).

이 기능의 한 가지 문제점은 별도의 위생 처리, 즉 앱의 일부 (예 : 실행 파일 만 libs가 아닌) 만 삭제할 수 있다는 것입니다. 문제는 vector가 unsanitized로 푸시되고 sanitized 코드가 튀어 나오면 푸시 프로그램은 버퍼를 unpoison해야한다는 것을 알지 못할 것입니다.