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