Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Přehled
Tento dotaz CodeQL má vysokou přesnost, což pomáhá při automatizaci chyb, ale má určitá omezení, a proto nebude schopen rozpoznat všechny případy závad UseAfterFree.
K chybě UseAfterFree dochází, když se po uvolnění použije přidělený blok paměti (označovaný také jako "visící ukazatel").
Chování v takových případech není definováno a v praxi může mít nezamýšlené důsledky, včetně poškození paměti, použití nesprávných hodnot nebo spuštění libovolného kódu.
Doporučení
Nastavte ukazatele na HODNOTU NULL hned po jejich uvolnění.
Příklad
V následujícím příkladu je pSomePointer uvolněn pouze v případě, že hodnota Status nebyla nula, a před dereferencováním pSomePointer k volání Method je Status znovu kontrolováno. Bohužel byl Status změněn mezi dvěma odkazy na pSomePointer, což umožňuje, že volání pSomePointer->Method() je prováděno přes dříve uvolněný ukazatel.
NTSTATUS Status = x();
if (Status != 0)
{
// Release pSomePointer if the call to x() failed
ExFreePool(pSomePointer);
}
Status = y();
if (Status == 0)
{
// Because Status may no longer be the same value than it was before the pointer was released,
// this code may be using pSomePointer after it was freed, potentially executing arbitrary code.
Status = pSomePointer->Method();
}
V opraveném příkladu je pSomePointer nastaven na NULL okamžitě po uvolnění a podmínka, která ověřuje, zda je bezpečné volat pSomePointer->Method(), kontroluje tuto dodatečnou podmínku, aby se zabránilo možné chybě.
NTSTATUS Status = x();
if (Status != 0)
{
// Release pSomePointer if the call to x() failed
ExFreePool(pSomePointer);
// Setting pSomePointer to NULL after being freed
pSomePointer = NULL;
}
Status = y();
// If pSomePointer was freed above, its value must have been set to NULL
if (Status == 0 && pSomePointer != NULL)
{
Status = pSomePointer->Method();
}
Další podrobnosti
Tento dotaz najdete v úložišti Microsoft GitHub CodeQL. Podrobnosti o tom, jak mohou vývojáři ovladačů systému Windows stáhnout a spustit CodeQL, najdete na stránce CodeQL and the Static Tools Logo Test.