__asan_poison_memory_region не работает - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать функцию allow_user_poisoning AddressSanitizer. Вот простой репродуктор:

#include <stdlib.h>
#include <stdio.h>

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 или что-то упустил?

1 Ответ

0 голосов
/ 25 апреля 2018

Вы поражены следующим пунктом в FAQ по Asan :

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-распространял присвоение *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
...