__asan_poison_memory_region لا يعمل

أحاول allow_user_poisoning ميزة AddressSanitizer. هنا هو بسيط reproducer:

#include 
#include 

void __asan_poison_memory_region(void *p, int n);

void unit_test_2(void)
{
    int *p;

    p = (int *)malloc(sizeof(int));

    __asan_poison_memory_region(p, sizeof(int));
    *p = 1;

    printf("%p:%d\n", p, *p);

    return;
}

سجل تصحيح ASAN يقول

==32232==AddressSanitizer Init done
Trying to poison memory region [0x00000147a040, 0x00000147a044)
0x147a040:1

حاولت ASAN تسميم الذاكرة لكن الحماية لم تنجح: تم كتابة البيانات بطريقة خاطئة إلى عنوان مسموم بدلاً من الإبلاغ عن الوصول غير الصحيح.

هل أسيء فهم __ asan_poison_memory_region أم أفتقد شيئًا ما؟

0

1 إجابة

يتم النقر على العنصر التالي في Asan FAQ :

Q: Why didn't ASan report an obviously invalid memory access in my code?

A1: If your errors is too obvious, compiler might have already optimized
    it out by the time Asan runs.

إذا نظرت إلى رمز التجميع ، فسترى أن مهمة التحويل البرمجي const-propagated إلى * p إلى printf :

mov DWORD PTR [rbx], 1
mov rsi, rbx
mov edx, 1
pop rbx
mov edi, OFFSET FLAT:.LC0
xor eax, eax
jmp printf
0
وأضاف
لقد استخدمت -O0 لإنشاء اختبار الوحدة ، لذا لم تعمل شركة GCC على تحسين الشفرة. وأنا فقط تحقق رمز التجميع ، وعملت كما هو متوقع.
وأضاف المؤلف user14944, مصدر
سوف أصحح أعمق في الليباسان وأحدثه لاحقًا.
وأضاف المؤلف user14944, مصدر
@ user14944 لا أرى كيف يمكن أن يساعدك تصحيح الأخطاء الليباصان هنا ، فستحتاج إلى تصحيح تصحيحات تحسين دول مجلس التعاون الخليجي في هذه الحالة. إليك مثال godbolt الذي يثبت اقتراحي.
وأضاف المؤلف yugr, مصدر