c++ - 为什么 electric fence/Valgrind 无法捕获此缓冲区溢出问题?

标签 c++ c memory-leaks valgrind 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

但是,我没有遇到任何崩溃。这里没有电围栏的作用。 我错过了什么? 我看到这里发布了类似的问题 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/

相关文章:

c - 猜谜游戏程序

objective-c - 检查图像(NSImage)分辨率是否泄漏内存

c# - 从 ActiveX 调用时未释放 WPF 内存

c++ - 我需要什么硬件/软件才能将我的 C++/wxWidgets 应用程序移植到 MAC?

c++ 公历和儒略历继承

android - 通过 JNI 从 C++ 发送 Intent

c - 变量 char* 不会释放?

c++ - 如何在C++中表示无理数

c - fopen 没有打开文件流...我该如何解决这个问题?

iphone - 另一款 iPhone - CGBitmapContextCreateImage 泄漏