clang address sanitizer не может найти применение после освобождения - PullRequest
0 голосов
/ 17 мая 2018

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

#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 --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

1 Ответ

0 голосов
/ 17 мая 2018

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

...