clang地址消毒剂无法在免费后找到使用

时间:2018-05-17 11:58:16

标签: c clang address-sanitizer

我正在尝试使用 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

1 个答案:

答案 0 :(得分:1)

您使用的clang版本已经过时了 - it was released in June 2014.当前版本的clang具有更强大的内存清理程序,可以解决此问题。