Megosztás:


Figyelmeztetés C26400

Ne rendelje hozzá a kiosztás vagy függvényhívás owner<T> eredményét visszatérési értékkel egy nyers mutatóhoz, használja owner<T> inkább (i.11)

Megjegyzések

Ez az ellenőrzés segít kikényszeríteni az *I.11 szabályt: Soha ne adja át a tulajdonjogot nyers mutatóval (T*), amely az R.3 szabály egy részhalmaza : A nyers mutató (a T*) nem tulajdonos. Pontosabban figyelmeztet minden olyan hívásra operator new, amely nyers mutatótípusú változóba menti az eredményét. Emellett figyelmezteti azokat a függvényeket, amelyek akkor térnek vissza gsl::owner<T> , ha eredményeik nyers mutatókhoz vannak rendelve. Az ötlet az, hogy egyértelműen meg kell adnia a memóriaerőforrások tulajdonjogát. További információkért tekintse meg a C++ alapvető irányelveit.

A figyelmeztetés kijavításának legegyszerűbb módja a deklaráció használata auto , ha az erőforrást azonnal hozzárendeli a változódeklarációhoz. Ha ez a javítás nem lehetséges, javasoljuk, hogy használja a típust gsl::owner<T>. Az auto operátorral new inicializált deklarációk "tulajdonosok", mert feltételezzük, hogy a kiosztás eredménye implicit módon tulajdonosmutató. Ezt a feltételezést átadjuk a auto változónak, és úgy kezeljük, mint owner<T>.

Ha ez az ellenőrzés egy visszaadott owner<T>függvény hívását jelzi, az a kódban található jogos hiba jelzése lehet. Alapvetően arra a helyre mutat, ahol a kód kiszivárog egy explicit tulajdonosi fogalmat (és talán magát az erőforrást).

Ez a szabály jelenleg csak a helyi változókat ellenőrzi. Ha kiosztást rendel egy formális paraméterhez, globális változóhoz, osztálytaghoz stb., az nincs megjelölve. Az ilyen forgatókönyvek megfelelő lefedettségét a jövőbeli munkához tervezik.

Kódelemzés neve: NO_RAW_POINTER_ASSIGNMENT.

1. példa: Egyszerű foglalás

char *buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // C26400

2. példa: Egyszerű foglalás (a gsl::owner<T>)

gsl::owner<char*> buffer = nullptr;
if (useCache)
    buffer = GetCache();
else
    buffer = new char[bufferSize];  // OK

3. példa: Egyszerű foglalás (a következővel autojavítva: )

auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK