警告 C26400
owner<T>
戻り値を持つ割り当てまたは関数呼び出しの結果を生ポインターに割り当てないでください。代わりにowner<T>
を使用します (i.11)
解説
このチェックは、*rule I.11: Never transfer ownership by a raw pointer (T*) を適用するのに役立ちます。これは、ルール R.3: 生ポインター (T*) が所有していないのサブセットです。 具体的には、結果を生ポインター型に保存する、operator new
の呼び出しについて警告します。 また、結果が生ポインターに割り当てられている場合、gsl::owner<T>
を返す関数の呼び出しについても警告します。 この考え方は、メモリ リソースの所有権を明確に指定する必要があるということです。 詳細については、「C++ Core Guidelines」を参照してください。
この警告を修正する最も簡単な方法は、リソースが変数宣言においてすぐに割り当てられる場合に auto
宣言を使用することです。 この修正を行うことができない場合、gsl::owner<T>
型を使用することをお勧めします。 new
演算子で初期化された auto
宣言は、"所有者" になります。すべての割り当ての結果は、暗黙的にオーナー ポインターになるはずだからです。 この仮定は auto
変数に適用され、これを owner<T>
として扱います。
このチェックによって owner<T>
を返す関数の呼び出しにフラグが設定された場合、コード内に本当のバグがあることを示している可能性があります。 基本的には、コードが明らかな所有権 (またはリソースそのもの) の概念を示している箇所が示されます。
現時点では、このルールはローカル変数のみをチェックします。 仮パラメーター、グローバル変数、クラス メンバーなどに割り当てる場合は、フラグは設定されません。 これらのシナリオには、今後対応していく予定です。
コード分析名: 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