В последнее время я экспериментировал с 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 в исполняемом файле.