电动栅栏库不生效的gcc(gcc with electric fence library does

2019-08-31 21:08发布

我写了有记忆问题,动态分配片段; 当编译-lefence选项,似乎没有什么效果。 下面是代码段:

int main(int argc, char *argv[])
{
  int *a = (int *)malloc(2*sizeof(int));
  for(int i = 0; i <=2; ++i){
    a[i] = i;
    printf ("%d\n",a[i]);
  }

  free(a);
  return 0;
}

和编译选项:

gcc -g3 -Wall -std=c99 outOfBound.c -lefence

预期的结果是,当a.out执行将有一个核心转储之后i被分配给2和a[i]=i被调用。

那么,为什么-lefence有没有影响?

我也增加了在循环上限至9日,但仍没有核心转储electric-fence调用。 (事实上的确有默认核心转储,但这可能是由于MALLOC_CHECK_ ENV virable因为当我export MALLOC_CHECK_=0 ,就不会有更多的核心转储)。

UPDATE:整个结果nm -A a.out是如下:

a.out:08049f28 d _DYNAMIC
a.out:08049ff4 d _GLOBAL_OFFSET_TABLE_
a.out:0804864c R _IO_stdin_used
a.out:         w _Jv_RegisterClasses
a.out:08049f18 d __CTOR_END__
a.out:08049f14 d __CTOR_LIST__
a.out:08049f20 d __DTOR_END__
a.out:08049f1c d __DTOR_LIST__
a.out:08048718 r __FRAME_END__
a.out:08049f24 d __JCR_END__
a.out:08049f24 d __JCR_LIST__
a.out:0804a01c A __bss_start
a.out:0804a014 D __data_start
a.out:08048600 t __do_global_ctors_aux
a.out:08048480 t __do_global_dtors_aux
a.out:0804a018 d __dso_handle
a.out:         w __gmon_start__
a.out:080485f2 t __i686.get_pc_thunk.bx
a.out:00000000 a __init_array_end
a.out:00000000 a __init_array_start
a.out:080485f0 T __libc_csu_fini
a.out:08048580 T __libc_csu_init
a.out:         U __libc_start_main
a.out:0804a01c A _edata
a.out:0804a024 A _end
a.out:0804862c T _fini
a.out:08048648 R _fp_hw
a.out:080483b4 T _init
a.out:08048450 T _start
a.out:0804a01c b completed.6159
a.out:0804a014 W data_start
a.out:0804a020 b dtor_idx.6161
a.out:080484e0 t frame_dummy
a.out:         U free
a.out:08048504 T main
a.out:         U malloc
a.out:         U printf

(我使用的Debian包electric-fence在Ubuntu 12.04 32位, gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

更新(20140801):

对于electric-fence的版本2.2.4通过Debian的(测试分支,即杰西)封装,它的工作原理。

Answer 1:

有可能你正在运行到这一点。

...它必须增加分配的大小,以字大小的倍数。 此外,该功能包括memalign()和valloc()必须履行的内存分配的定位明确的规范,而这一点,也只能通过增加分配的大小来实现。 因此,会出现的情况,其中一个存储器分配的末尾包含一些填充空间,并且将不会被检测到填充空间的访问,即使它们是超支。

尝试超越边界多一点,看看在什么点在超限检测踢。



Answer 2:

一旦你编译和执行上述程序不具有电动栏杆库链接,它可以在没有任何分段故障运行。

所以,最好将其与电动栏杆库链接,然后通过加载它在gdb给下面的命令来运行它

$ gdb a.out
....
(gdb)run
Starting program: /home/arif/sysprog-2017/processmgmt/nonlocalgoto/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
  Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>
0
1
Program received signal SIGSEGV, Segmentation fault.
0x000055555555484d in main (argc=1, argv=0x7fffffffe228) at temp.c:8
8       a[i] = i;

因此,从上述GDB的输出,你可以做出来,这是造成问题的源代码行数,如果您打印的我在这个时刻的值,这将是2 :)



文章来源: gcc with electric fence library does not take effect