Megosztás:


Figyelmeztetés C26403

"változó" mutató alaphelyzetbe állítása vagy explicit törlése owner<T> (r.3)

A tulajdonosmutatók olyanok, mint az egyedi mutatók: kizárólag egy erőforrást birtokolnak, és kezelik az erőforrás kiadását vagy más tulajdonosoknak történő átvitelét. Ez az ellenőrzés ellenőrzi, hogy egy helyi tulajdonos mutatója megfelelően tartja-e fenn az erőforrást egy függvény összes végrehajtási útvonalán keresztül. Ha az erőforrás nem lett átadva egy másik tulajdonosnak, vagy nem lett explicit módon felszabadítva, az ellenőrző figyelmezteti, és a mutatóváltozó deklarációjára mutat.

További információkért tekintse meg a C++ alapvető irányelveit.

Megjegyzések

  • Ez az ellenőrzés jelenleg nem adja meg azt az elérési utat, amely nem tudja felszabadítani az erőforrást. Ez a viselkedés a jövőbeni kiadásokban javítható. Előfordulhat, hogy a javítás pontos helyét nehéz megtalálni. A jobb módszer az, ha az összetett függvények egyszerű mutatóit egyedi mutatókkal próbálja lecserélni a kockázatok elkerülése érdekében.

  • Az ellenőrzés elvethet egy túlbonyolult függvényt, hogy ne tiltsa le a kódelemzést. A függvények összetettségét általában ésszerű küszöbérték alatt kell tartani. Ha egyértelmű igény van rá, érdemes lehet helyi összetettségi ellenőrzést hozzáadni a C++ Alapvető irányelvek modulhoz. Ez a korlátozás az adatfolyamokra érzékeny egyéb szabályokra is vonatkozik.

  • A figyelmeztetés egyértelműen hamis pozitív eseteket okozhat, amikor a memória csak a mutató null ellenőrzése után törlődik. Ezek a hamis pozitív értékek az eszköz API-jának jelenlegi korlátozásából erednek, de a jövőben tovább fejleszthetők.

Kódelemzés neve: RESET_OR_DELETE_OWNER.

példa

Hiányzó törlés a hibakezelés során:

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;