GCC с библиотекой электрического забора не вступает в силу
Я написал фрагмент, который имеет проблемы с памятью при динамическом размещении; при компиляции с -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 желательны с тех пор, когда я export MALLOC_CHECK_=0
, не было бы больше дамп ядра).
ОБНОВЛЕНИЕ: весь результат 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 32bit, gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
)
Обновление (20140801):
За electric-fence
версии 2.2.4
упаковано в debian(ветка тестирования, т.е. jessie), все работает.
2 ответа
Возможно, вы сталкиваетесь с этим.
... он должен увеличить размер выделения до кратного размера слова. Кроме того, функции memalign() и valloc() должны соблюдать явные спецификации для выравнивания выделения памяти, и это также может быть реализовано только путем увеличения размера выделения. Таким образом, будут ситуации, в которых конец выделения памяти содержит некоторое пространство заполнения, и доступы к этому пространству заполнения не будут обнаружены, даже если они переполнены.
Попробуйте немного превысить границы и посмотрите, с какого момента начинается обнаружение переполнения.
После того, как вы скомпилируете и запустите вышеупомянутую программу, не связывая ее с библиотекой электрического забора, она может работать без ошибок сегментации
Так что лучше связать его с библиотекой электрического забора, а затем запустить его, загрузив его в 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 вы можете разобрать номер строки источника, который вызывает проблему, если вы напечатаете значение i в этот момент, это будет 2:)