Я пытаюсь использовать дезинфицирующее средство для адресов 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
clang
4 иvalgrind
сообщают об этом для меня с вашими параметрами компиляции и аргументами командной строки. - person Acorn   schedule 17.05.2018./a.out /home/oren/ggg.txt
?./main
не должно существовать при связывании с предоставленной вами командой. - person ks1322   schedule 17.05.2018