警告 C26411
參數 'parameter' 是唯一指標的參考,而且永遠不會重新指派或重設、使用
T*
或 改用 或T&
(r.33)
當您以傳址方式將唯一指標傳遞至函式時,表示其資源可能會在函式內釋放或傳輸。 如果函式只使用其參數來存取資源,則傳遞原始指標或參考是安全的。 如需詳細資訊,請參閱 C++ 核心指導方針規則 R.33:取得unique_ptr<widget& 參數來表示函式重新配置小工具>。
備註
警告 C26410 的限制也適用於這裡。
偵測
release
或reset
存取唯一指標的啟發學習法是天真。 我們只會偵測指派運算符和具名reset
函式的呼叫(不區分大小寫)。 顯然,此偵測並未涵蓋智慧型手機指標修改的所有可能案例。 (例如,它不會偵測std::swap
到 自定義智慧指標中的任何特殊非const
函數)。 我們預期此警告可能會在自定義類型上產生許多誤判,而且在某些情況下會處理標準唯一指標。 我們預期會改善啟發學習法,因為我們實作更多專注於智慧型手機指標的檢查。智慧型指標通常是範本帶來有趣的限制。 如果未使用範本,則不需要編譯程式來處理範本程式代碼。 在限制使用智慧型手機指標介面的程式代碼中,檢查程式可能會產生非預期的結果。 檢查程式無法正確識別範本類型的語意,因為某些函式可能永遠不會使用。 針對標準
std::unique_ptr
,此限制可藉由辨識類型的名稱來減輕。 未來可能會擴充此分析,以涵蓋更知名的智慧型手機。執行隱含擷取傳址的 Lambda 運算式可能會導致關於唯一指標參考的令人驚訝警告。 目前會報告 Lambda 中所有擷取的參考參數,不論是否重設。 未來的版本可能會擴充啟發學習法,以將 Lambda 字段和 Lambda 參數相互關聯。
程式代碼分析名稱: NO_REF_TO_UNIQUE_PTR
範例:不必要的參考
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);
}