Megosztás a következőn keresztül:


C26411 figyelmeztetés

A paraméter egy egyedi mutatóra mutató hivatkozás, és soha nem rendeli vissza, nem állítja vissza, nem használja T* vagy T& helyette (r.33)

Ha hivatkozással ad át egyedi mutatót egy függvénynek, az azt jelenti, hogy az erőforrás felszabadítható vagy átadható a függvényen belül. Ha a függvény csak az erőforrás eléréséhez használja a paraméterét, biztonságosan átadhat egy nyers mutatót vagy egy hivatkozást. További információ: C++ Alapvető irányelvek R.33 szabály: Vegyünk egy unique_ptr<widget>> paramétert annak kifejezéséhez, hogy egy függvény újra ellátja a widgetet.

Megjegyzések

  • A C26410 figyelmeztetés korlátozásai itt is érvényesek.

  • Az egyedi mutató észlelésére release vagy reset elérésére vonatkozó heurisztikus naiv. Csak a hozzárendelési operátorok és a nevesített reset függvények hívásait észleljük (kis- és nagybetűk megkülönböztetése). Nyilvánvaló, hogy ez az észlelés nem fedi le az intelligens mutató módosításainak összes lehetséges esetét. (Például nem észleli std::swapaz egyéni intelligens mutatóban lévő speciális nem-függvényeketconst ). Arra számítunk, hogy ez a figyelmeztetés számos hamis pozitív eredményt fog eredményezni az egyéni típusok esetében, és bizonyos esetekben a standard egyedi mutatókkal foglalkozik. A heurisztikus fejlesztésre számítunk, mivel több, intelligens mutatóra összpontosító ellenőrzést hajtunk végre.

  • Az a tény, hogy az intelligens mutatók gyakran sablonok, érdekes korlátozásokat eredményeznek. A fordító nem szükséges sablonkódok sablonkódjainak feldolgozásához, ha nincs használatban. Az intelligens mutatófelületek korlátozott használatát lehetővé tevő kódban az ellenőrző váratlan eredményeket hozhat. Az ellenőrző nem tudja megfelelően azonosítani a sablontípus szemantikáját, mert előfordulhat, hogy egyes függvények soha nem lesznek használatban. A szabvány std::unique_ptresetében ez a korlátozás a típus nevének felismerésével csökkenthető. Ez az elemzés a jövőben kiterjeszthető, hogy ismertebb intelligens mutatókat fedjen le.

  • Az implicit rögzítést használó Lambda-kifejezések meglepő figyelmeztetésekhez vezethetnek az egyedi mutatókra való hivatkozásokkal kapcsolatban. Jelenleg a lambdas összes rögzített referenciaparaméterét jelenti a rendszer, függetlenül attól, hogy alaphelyzetbe állnak-e vagy sem. Egy későbbi kiadás kiterjesztheti a heurisztikust a lambdamezők és lambdaparaméterek korrelációjához.

Kódelemzés neve: NO_REF_TO_UNIQUE_PTR.

Példa: Szükségtelen hivatkozás

void TraceValid(std::unique_ptr<Slot> &slot)    // C26411
{
    if (!IsDamaged(slot.get()))
        std::cout << *slot.get();
}

void ReleaseValid(std::unique_ptr<Slot> &slot)  // OK
{
    if (!IsDamaged(slot.get()))
        slot.reset(nullptr);
}