我正在尝试使用 clang地址清理程序,例如this link,其中 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版本:
$ 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