Electric fence -=-=-=-=-=-=-=-= Thus spake the master programmer: "A well-written program is its own heaven; a poorly-written program is its own hell." -- Geoffrey James, "The Tao of Programming" Známou knihovnou pro testování haldy je libefence. Použití knihovny je podobné jako u mcheck - při linkování přidáte přepínač -lefence. Je to velmi šikovná knihovna, která nahradí volání pro alokaci haldy funkcemi, které mezi jednotlivé bloky umístí stránky zablokované proti čtení i zápisu. Díky tomu se odchytí nejenom zápis mimo blok ale i čtení. Navíc bloky jsou poměrně daleko od sebe a tak pravděpodobnost, že ukazatel "přestřelí" z jednoho bloku do druhého je poměrně malá. Problém tohoto přítupu je, že stránky nelze samozřejmě dát kamkoliv. Proto když velikost bloku není dělitelná velikostí stránky, lze stránka zapasovat pouze z jedné strany (na druhé bude nějaká mezera). Navíc je nutné brát v úvahu alignment, který ještě více omezuje přesné měření. Knihovna lze proto ovládat pomocí několika proměnných (buď jako globálních proměnných v programu, nebo runtime ze shellu). Ty jsou následující: EF_ALIGNMENT Určuje na jak velkou hodnotu se mají bloky zarovnávat. EF_PROTECT_BELOW Pokud je nastavena, stránky se napasují dolu. Bude se tedy testovat spíše podtečení. EF_PROTECT_FREE Uvolněné bloky zůstanou v paměti a zablokují se. Odchytí se tedy přístup do uvolněných bloků. EF_ALLOW_MALLOC_0 Povolí alokaci velikosti nula. Výsledky knihovny jsou mnohem pozbudivější, než u knihovny mcheck: Chyby pro použití haldy zapomenuté naalokované bloky paměti uvolnění nenaalokovaného bloku free() called before first malloc(). vícenásobné uvolnění bloku free(400b5f9c): address not from malloc(). alokace a realokace bloku o velikosti 0 Allocating 0 bytes, probably a bug. použití paměti bez testu na selhání malloc Chyby pro použití ukazatelů použití uvolněného bloku pro zápis crash při přístupu použití uvolněného bloku pro čtení crash při přístupu zápis za koncem pole v zásobníku zápis za koncem alokovaného bloku crash při přístupu čtení za koncem alokovaného bloku crash při přístupu zápis daleko za koncem alokovaného bloku crash při přístupu zápis před koncem alokovaného bloku crash při přístupu čtení před koncem alokovaného bloku crash při přístupu čtení neinicalizované paměti načte 0 Knihovna uspěla všude, kde díky svému návrhu mohla vyjma čtení neinicializované paměti. Možná by knihovna mohla blok zinicializovat alespoň jinou hodnoutou, než je 0. Také jednoduchá funkce vypisující zapomenuté bloky by se podle mého názoru hodila. Díky trikům s mapováním stránek je snížena její portabilita a pravděpodobně neexistuje verze pro DJGPP a jiné ne-UNIXové platformy. Celkově je ale libefence užitečná a jednoduchá knihovna, která ušetří spostu starostí a tak ji můžu vřele každému doporučit. Podle mého názoru je to dobrý kompromis mezi účiností a pracností. Nevyžaduje žádné větši úsilí a nejčastější chyby najde. Zdrojové kódy najdete na: sunsite.ms.mff.cuni.cz/pub/Linux/devel/lang/c. výheň