LINUX.ORG.RU

не работает libefence

 


1

3

подскажите, почему не рабоатет?

$ cat test.c 
#include <stdlib.h>
int main()
{
	char *arr;
	arr = malloc(sizeof(char)*5);
	arr[5] = 10;
	free(arr);
	return 0;
}
$ make test
cc -Wall -g -lefence    test.c   -o test
$ ./test 

  Electric Fence 2.2 Copyright (C) 1987-1999 Bruce Perens <bruce@perens.com>

если я правильно понимаю, то я должен был бы получить segfault

★★★

Ответ на: комментарий от mittorn

нет, если компилировать с -lefence

IvanR ★★★
() автор топика
Ответ на: комментарий от mittorn

В приведённом коде не видно, чтобы что-то использовалось из libefence. Поэтому линкуй, не линкуй, всё равно.

akk ★★★★★
()

Ну, во-первых, лучше всего собирать с -Wl,--no-as-needed, иначе можешь получить, что с efence ты не слинкуешься. Во-вторых, крэшится начнет с arr[8], поскольку, в действительности, malloc будет выделять выровненный кусок памяти.

Vovka-Korovka ★★★★★
()
Последнее исправление: Vovka-Korovka (всего исправлений: 1)
Ответ на: комментарий от akk

Не все равно. Если по дефолту не включен --as-needed, или, если самому явно указать --no-as-needed, то ты слинкуешься, даже, если нет явных вызовов.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от akk

разве malloc не вызывает libefence?

IvanR ★★★
() автор топика
Ответ на: комментарий от Vovka-Korovka

Кстати, libefence реагирует на специальную переменную EF_ALIGNMENT

Electric Fence provides the variable EF_ALIGNMENT so that the user can control the default alignment used by malloc(), calloc(), and realloc(). To debug overruns as small as a single byte, you can set EF_ALIGNMENT to zero. This will result in Electric Fence malloc() returning unaligned addresses for allocations with sizes that are not a multiple of the word size. This is not a problem in most cases, because compilers must pad the size of objects so that alignment restrictions are honored when storing those objects in arrays. The problem surfaces when software allocates odd-sized buffers for objects that must be word-aligned. One case of this is software that allocates a buffer to contain a structure and a string, and the string has an odd size (this example was in a popular TIFF library). If word references are made to un-aligned buffers, you will see a bus error (SIGBUS) instead of a segmentation fault. The only way to fix this is to re-write the offending code to make byte references or not make odd-sized allocations, or to set EF_ALIGNMENT to the word size.

Т.е. если запустить твой пример вот так

EF_ALIGNMENT=0 ./test

то получишь свой segfault.

Vovka-Korovka ★★★★★
()

памятка

sizeof(char) по стандарту всегда равен 1

mix_mix ★★★★★
()

Я, кстати, правильно понял, что для тех же самых целей, для которых используют libefence, сейчас можно просто запустить программу под valgrind, и он найдёт всё то же самое?

Ну да, я подозреваю, что под valgrind программа будет работать несколько медленнее. Зато файл проекта кромсать не надо.

valgrind активно пользуюсь, доволен. Сабж не пробовал, как-то он прошёл мимо меня.

// hobbit, с чужого компа.

anonymous
()
Ответ на: комментарий от anonymous

мне с ним сложнее работать, а у libefence сразу в сегфолт и coredump в gdb показывает, где был выход за границу массива

IvanR ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.