为什么电栅栏/ Valgrind无法捕获这个缓冲区溢出问题?

dex*_*ous 4 c c++ valgrind memory-leaks electric-fence

我创建了一个错误的程序 - 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
Run Code Online (Sandbox Code Playgroud)

但是,我没有遇到任何崩溃.这里没有电栅栏的效果.我错过了什么?我看到这里发布的类似问题gcc用电栅栏库没有生效,但似乎还没有答案.我在FC19上运行这个例子.有人有答案吗?即使是valgrind也未能发现问题?还有其他工具可以检测这些问题吗?

根据进一步的评论,我修改了缓冲区溢出函数,以便被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
Run Code Online (Sandbox Code Playgroud)

Electric Fence没有检测到任何错误,但Valgrind至少表现出来了.

v15*_*4c1 11

Valgrind仅限于二进制可用.如果您不介意在代码中插入一些检测(通过编译器),您可以尝试使用地址清理程序.它会限制分配区域(甚至是堆栈)的内存,然后检查每次读/写,因此它有更高的机会来捕获这些问题.

它集成在当前的gcc(4.8+)和clang(3.2+)中.只需编译你的代码,如:

gcc -g buggy.c  -o buggy.out -fsanitize=address
Run Code Online (Sandbox Code Playgroud)

执行时,它会输出如下内容:

==26247== ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff9fa0be54 at pc 0x4008df bp 0x7fff9fa0be00 sp 0x7fff9fa0bdf8
WRITE of size 4 at 0x7fff9fa0be54 thread T0
Run Code Online (Sandbox Code Playgroud)

和堆栈跟踪.

Chandler Carruth 在GN13的这次演讲中谈到了这一点

注意:即使在clang 3.1中也支持它,但是调用开关-faddress-sanitizer而不是-fsanitize=address.