为什么LLVM AddressSanitizer,但不是GCC,给我一个内存泄漏?

时间:2014-12-07 19:51:31

标签: c llvm

我正在尝试在C中实现二叉树。我有

struct treenode {
  int value;
  struct treenode *left;
  struct treenode *right;
};

typedef struct treenode Tree;

void insert(Tree **tree, int value);

但是得到“在1个对象中直接泄漏24个字节”。 llvm-symbolizer不会给我泄漏发生的实际行,但使用printf我已将执行跟踪到下面标记的行。编辑:用{{编译1}}如建议给出正确的行。没有AddressSantitizer运行工作正常。但是我没有看到内存泄漏的位置:摆脱-g并释放current似乎是这样做的,但我不明白为什么这两者都是泄密:newNode只是指向现有已分配内存的指针,current即将插入树中。

编辑:感谢所有评论/回答的人。我误解了asan如何报告其结果;泄漏是因为我在newNode中释放tree->left之前没有释放tree,正如评论者建议的那样。

使用GCC而不是Clang进行编译不会产生错误。对于Clang,我有

main

对于GCC我有

 % clang -O1 -g -fsanitize=address -fno-omit-frame-pointer -Wall -Werror -Wextra binarytree.c

Clang输出

% gcc -O1 -fsanitize=address -fno-omit-frame-pointer -Wall -Werror -Wextra binarytree.c

================================================================= ==24939==ERROR: LeakSanitizer: detected memory leaks Direct leak of 24 byte(s) in 1 object(s) allocated from: #0 0x49a1bb in __interceptor_malloc (/home/lidavidm/Code/learnc/binarytree+0x49a1bb) #1 0x4b795d in insert (/home/lidavidm/Code/learnc/binarytree+0x4b795d) #2 0x4b7d54 in main (/home/lidavidm/Code/learnc/binarytree+0x4b7d54) #3 0x7fa87fff703f in __libc_start_main (/usr/lib/libc.so.6+0x2003f) Indirect leak of 24 byte(s) in 1 object(s) allocated from: #0 0x49a1bb in __interceptor_malloc (/home/lidavidm/Code/learnc/binarytree+0x49a1bb) #1 0x4b7b9c in insert (/home/lidavidm/Code/learnc/binarytree+0x4b7b9c) #2 0x4b7d95 in main (/home/lidavidm/Code/learnc/binarytree+0x4b7d95) #3 0x7fa87fff703f in __libc_start_main (/usr/lib/libc.so.6+0x2003f) SUMMARY: AddressSanitizer: 48 byte(s) leaked in 2 allocation(s). 的实施:

insert

1 个答案:

答案 0 :(得分:2)

代码还可以,除了过于冗长和多余 比较:

void insert(Tree **tree, int value) {
    while(*tree)
        tree = value >= tree[0]->value ? &tree[0]->right : &tree[0]->left;
    *tree = malloc(sizeof **tree);
    **tree = (Tree){.value = value};
}

所以,泄漏显然是在其他地方。