В последнее время я экспериментировал с Electric Fence и не могу понять, как использовать его с кодом C ++.
Вот пример:
// test.cpp
#include <cstdlib>
using namespace std;
int main()
{
int *a = new int(10);
delete a;
}
Я скомпилировал это с
g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread
И я не вижу баннера Electric Fence в начале и не могу найти символы EF в исполняемом файле (используя команду nm).
Но если я изменю программу следующим образом:
// test.cpp
#include <cstdlib>
using namespace std;
int main()
{
char *p = (char*)malloc(20);
free(p);
int *a = new int(10);
delete a;
}
все хорошо - появляется EF. Я знаю, это вроде решает проблему, я знаю :). Я просто хочу понять, почему это не сработало, потому что new()
должен звонить malloc()
, а delete()
звонит free()
, нет?
Причиной, по которой я туда попал, является большой проект, использующий библиотеки boost и несколько других. И эта программа никогда не вызывает malloc()
или free()
напрямую. И когда я создавал его с помощью EF, я не только связывал EF с конечным исполняемым файлом, но перестраивал все библиотеки, пытаясь связать EF с ними. И я не могу найти символы EF ни в одном из них. Это правильный подход? Или это неправильно, и EF должен быть связан только с исполняемым файлом, а библиотеки должны быть оставлены нетронутыми? Но опять же, я не могу найти символы EF в исполняемом файле.