我创建了一个有问题的程序 - buggy.c - 这是缓冲区 t 的缓冲区溢出场景。 你可以看到我写了 5 个以上的索引。它工作正常。它永远不会给我一个错误。我在想,为什么会这样?我什至尝试了 Valgrind,这也找不到这个问题。你能告诉我这里有什么问题吗?
void buffer_overflow(void)
{
int t[5];
int i = 0;
for(i = 0; i<=7; i++)
{
t[i] = i;
}
/** this will cause buffer overflow **/
printf("Memory_overflow_completed\r\n");
}
int main(int argc, char **argv)
{
buffer_overflow();
return 0;
}
$gcc -g buggy.c -o buggy.out -lefence
$./buggy.out
但是,我没有遇到任何崩溃。这里没有电围栏的作用。 我错过了什么? 我看到这里发布了类似的问题 gcc with electric fence library does not take effect ,但似乎还没有答案。 我在 FC19 上运行这个例子。有人有答案吗?甚至 valgrind 也无法检测到问题?有没有其他工具可以检测这些问题?
根据进一步的评论,我修改了缓冲区溢出函数以被 Electric Fence 检测到。但是,Electric Fence 无法检测到该问题。这是修改后的功能。
void buffer_overflow(void)
{
#if 0
int t[5];
int i = 0;
for(i = 0; i<=7; i++)
{
t[i] = i;
}
#endif
char *t = malloc(sizeof(char)*7);
strcpy(t,"SHREYAS_JOSHI");
/** this will cause buffer overflow **/
printf("Memory_overflow_completed\r\n");
free(t);
}
[joshis1@localhost blogs-tune2wizard]$ gcc -g buggy.c -o buggy.out -lefence
[joshis1@localhost blogs-tune2wizard]$ ./buggy.out
Electric Fence 2.2.2 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
Memory_overflow_completed
Electric Fence 没有检测到错误,但 Valgrind 至少显示了它。
最佳答案
Valgrind 受限于只有二进制可用。如果您不介意在您的代码中插入一些检测(通过编译器),您可以尝试 address sanitizer .它会毒化分配区域周围的内存(甚至在堆栈上),然后检查每次读/写,因此它更有可能发现这些问题。
它集成在当前的 gcc (4.8+) 和 clang (3.2+) 中 只需像这样编译您的代码:
gcc -g buggy.c -o buggy.out -fsanitize=address
执行后,它会打印出如下内容:
==26247== ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff9fa0be54 at pc 0x4008df bp 0x7fff9fa0be00 sp 0x7fff9fa0bdf8
WRITE of size 4 at 0x7fff9fa0be54 thread T0
和堆栈跟踪。
Chandler Carruth 在 this talk at GN13 中谈到了它
注意:即使在 clang 3.1 中也支持它,但开关称为 -faddress-sanitizer
而不是 -fsanitize=address
。
关于c++ - 为什么 electric fence/Valgrind 无法捕获此缓冲区溢出问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19207778/