2

動的に割り当てるときにメモリの問題が発生するスニペットを作成しました。オプションでコンパイルすると-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

予想される結果は、が実行されると、が 2 に割り当てられて呼び出されたa.out後にコア ダンプが発生することです。ia[i]=i

では、なぜ-lefence効果がないのでしょうか。

また、ループの上限を 9 に増やしましたが、electric-fence呼び出したコア ダンプはまだありません。(実際には、デフォルトでコア ダンプがありますが、これは環境変数が原因である可能性があります。これはMALLOC_CHECK_、 Iexport 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

electric-fence( Ubuntu 12.04 32bit でdebian パッケージを使用していますgcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3)

更新 (20140801):

electric-fencedebian によってパッケージ化されたバージョン2.2.4(テスト ブランチ、つまり jessie) の場合、動作します。

4

2 に答える 2

0

これに遭遇する可能性があります。

...割り当てのサイズをワードサイズの倍数に増やす必要があります。さらに、関数 memalign() および valloc() は、メモリ割り当てのアラインメントに関する明示的な指定を尊重する必要があり、これも割り当てのサイズを増やすことによってのみ実装できます。したがって、メモリ割り当ての最後にパディング スペースが含まれる場合があり、そのパディング スペースへのアクセスは、オーバーランであっても検出されません。

境界をもう少し超えてみて、オーバーラン検出が開始されるポイントを確認してください。

于 2013-04-23T02:54:25.147 に答える