Clang Address Sanitizer не может найти применение после бесплатного

Я пытаюсь использовать дезинфицирующее средство для адресов clang, например эта ссылка со следующим примером, где rel_filename указывает куда-то внутри освобожденного буфера, и когда я отправляю его в printf, ничего плохого не происходит. Имеет ли это смысл?

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

int main(int argc, char **argv)
{
    char *dir;
    char *abs_filename;
    char *rel_filename;

    abs_filename = (char *) malloc( strlen(argv[1]) + 1 );
    strcpy( abs_filename, argv[1] );

    if (strchr( abs_filename, '/' ))
    {
        char *tmp = strrchr( abs_filename, '/' );
        dir = (char *) malloc( tmp-abs_filename+1 );
        *tmp = 0;
        strcpy( dir, abs_filename );
        rel_filename = tmp+1;
        free(abs_filename);
    }
    else
    {
        rel_filename = abs_filename;
        dir = NULL;
    }

    if (dir)          printf("directory is: %s\n",dir);
    if (rel_filename) printf("filenmae  is: %s\n",rel_filename);

    return 0;
}

Вот как я компилирую и вызываю код:

$ clang -O1 -g -fsanitize=address -fno-omit-frame-pointer -c main.c -o main.o

Затем я связываюсь с clang:

$ clang -g -fsanitize=address main.o -o main

Затем я запускаю, и все идет нормально, когда он действительно должен рухнуть, верно?

$ ./main /home/oren/ggg.txt
directory is: /home/oren
filenmae  is: ggg.txt

В чем дело?

Вот версия Clang:

$ clang --version
clang version 3.4.2 (tags/RELEASE_342/final 322618)
Target: x86_64-unknown-linux-gnu
Thread model: posix

OS:

Ubuntu 14.04.5 (LTS) 64 bit

person OrenIshShalom    schedule 17.05.2018    source источник
comment
Ну, неопределенное поведение неопределенно, все может случиться, правильно.   -  person cadaniluk    schedule 17.05.2018
comment
Сама память не просто исчезает и, скорее всего, все еще привязана к вашему процессу. Однако попытаться получить к нему доступ — это UB.   -  person Some programmer dude    schedule 17.05.2018
comment
Я понимаю, что это UB, но почему дезинфицирующее средство для адресов clang не сообщает об этом сценарии использования после освобождения?   -  person OrenIshShalom    schedule 17.05.2018
comment
Оба clang 4 и valgrind сообщают об этом для меня с вашими параметрами компиляции и аргументами командной строки.   -  person Acorn    schedule 17.05.2018
comment
Вы запускаете его с ./a.out /home/oren/ggg.txt? ./main не должно существовать при связывании с предоставленной вами командой.   -  person ks1322    schedule 17.05.2018
comment
@ks1322 ks1322 спасибо, я добавил отсутствующий -o main.   -  person OrenIshShalom    schedule 17.05.2018
comment
Я не смог воспроизвести это на Fedora 28. Вероятно, это ошибка конкретной ОС. Также стоит опубликовать вашу ОС и версию clang.   -  person ks1322    schedule 17.05.2018
comment
Добавлена ​​версия clang (3.4.2) и ОС (Ubuntu 14.04.5)   -  person OrenIshShalom    schedule 17.05.2018


Ответы (1)


Используемая вами версия clang довольно старая -- это был выпущен в июне 2014 года. Текущие версии clang имеют более надежное средство очистки памяти, способное выявить эту проблему.

person Community    schedule 17.05.2018