__Asan_memcpy невыразим по замыслу или случайно?

Я использую clang 4.0.0 asan на Linux x86_64. Я собрал свой код, используя clang++ -fsanitize=address.

Я не могу устранить следующую проблему с памятью, о которой сообщает asan за пределами моего кода: (я сократил трассировку стека и изменил некоторые пути к файлам)

==104630==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60200019367c at pc 0x2aaaaadc0d85 bp 0x7fffffff7e90 sp 0x7fffffff7640
READ of size 16 at 0x60200019367c thread T0
#0 0x2aaaaadc0d84 in __asan_memcpy /path/to/llvm-4.0.0.src/projects/compiler-rt/lib/asan/asan_interceptors.cc:453
#1 0x5b74a8 in _ZNSt3__116allocator_traitsINS_9allocatorIiEEE20__construct_backwardIiEENS_9enable_ifIXaaoosr7is_sameIS2_NS1_IT_EEEE5valuentsr15__has_constructIS2_PS6_S6_EE5valuesr31is_trivially_move_constructibleIS6_EE5valueEvE4typeERS2_S8_S8_RS8_ /path/to/clang/clang-4.0.0/rawbin/../include/c++/v1/memory:1676:17
#2 0x5b74a8 in std::__1::vector<int, std::__1::allocator<int> >::__swap_out_circular_buffer(std::__1::__split_buffer<int, std::__1::allocator<int>&>&) /path/to/clang/clang-4.0.0/rawbin/../include/c++/v1/vector:886
#3 0x5b648a in void std::__1::vector<int, std::__1::allocator<int> >::__push_back_slow_path<int const&>(int const&) /path/to/clang/clang-4.0.0/rawbin/../include/c++/v1/vector:1574:5
#4 0x1d8d2ba in std::__1::vector<int, std::__1::allocator<int> >::push_back(int const&) /path/to/clang/clang-4.0.0/rawbin/../include/c++/v1/vector:1591:9
#5 0x1d8d2ba in bar::baz(a_type const*, int const*, std::__1::vector<int, std::__1::allocator<int> >&) /path/to/installed/3rd/party/library/that/i/did/not/build/foo.cc:394

Я следую приведенным здесь инструкциям и проверил, что мой.supp читается, набрав в нем тарабарщину и увидев "AddressSanitizer: не удалось разобрать подавления", напечатанные на моем терминале. Я посмотрел на src для __asan_memcpy в compiler-rt-4.0.0.src/lib/asan/asan_interceptors.cc

452 void *__asan_memcpy(void *to, const void *from, uptr size) {
453   ASAN_MEMCPY_IMPL(nullptr, to, from, size);
454 }

Я думаю, что "nullptr" это моя проблема. Я проследил за макро-тропой, чтобы найти эти строки

 68       AsanInterceptorContext *_ctx = (AsanInterceptorContext *)ctx;     \
 69       bool suppressed = false;                                          \
 70       if (_ctx) {                                                       \
 71         suppressed = IsInterceptorSuppressed(_ctx->interceptor_name);   \
 72         if (!suppressed && HaveStackTraceBasedSuppressions()) {         \
 73           GET_STACK_TRACE_FATAL_HERE;                                   \
 74           suppressed = IsStackTraceSuppressed(&stack);                  \
 75         }                                                               \
 76       }                                                                 \
 77       if (!suppressed) {                                                \
 78         GET_CURRENT_PC_BP_SP;                                           \
 79         ReportGenericError(pc, bp, sp, __bad, isWrite, __size, 0, false);\
 80       } 

Поскольку ctx всегда равен "nullptr", "if (_ctx)" всегда оценивается как false, что означает, что я не смогу подавить ошибку памяти. Это по замыслу или по ошибке?

Беглый взгляд на последний src-компилятор, который я сегодня выполнил (git hash 286b899df64bb82a2da253114653adaf15da2fce, git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@323510 977 -0410-b5e6-96231b3b80d8) показывает, что такая же ситуация существует для последней реализации asan, поэтому я не думаю, что обновление до последней версии asan rtl поможет.

0 ответов

Другие вопросы по тегам