警告 C26400
請勿將配置的結果或具有
owner<T>
傳回值的函式呼叫指派給原始指標,請改用owner<T>
(i.11)
備註
這項檢查有助於強制執行 *rule I.11:永遠不要透過原始指標 (T*) 轉移擁有權,這是規則 R.3 的子集:原始指標(T*) 不是擁有 。 具體來說,它會在任何 對 的呼叫 operator new
上發出警告,這會將其結果儲存在原始指標類型的變數中。 它也會在呼叫函式時發出警告,如果函式的結果指派給原始指標,則會傳回 gsl::owner<T>
。 其概念是,您應該清楚說明記憶體資源的擁有權。 如需詳細資訊,請參閱 C++ 核心指導方針 。
修正此警告最簡單的方式,是在變數宣告上立即指派資源時使用 auto
宣告。 如果無法進行此修正,建議您使用 類型 gsl::owner<T>
。 auto
使用 運算子 new
初始化的宣告是「擁有者」,因為我們假設任何配置的結果都是隱含擁有者指標。 我們會將此假設傳送至 變數, auto
並將它 owner<T>
視為 。
如果此檢查會標幟對傳回 owner<T>
之函式的呼叫,則可能表示程式碼中有合法的 Bug。 基本上,它會指向程式碼洩漏明確擁有權概念的位置(或許是資源本身)。
此規則目前只會檢查區域變數。 如果您將配置指派給正式參數、全域變數、類別成員等等,則不會加上旗標。 針對未來的工作,已規劃適當涵蓋這類案例。
程式碼分析名稱: NO_RAW_POINTER_ASSIGNMENT
範例 1:簡單配置
char *buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // C26400
範例 2:簡單配置(已修正 gsl::owner<T>
)
gsl::owner<char*> buffer = nullptr;
if (useCache)
buffer = GetCache();
else
buffer = new char[bufferSize]; // OK
範例 3:簡單配置(固定為 auto
)
auto buffer = useCache ? GetCache() : new char[bufferSize]; // OK