警告 C26485
式 'array-name': ポインターの減衰 (bounds.3) への配列はありません。
解説
C26481 と同様に、このチェックによって C++ Core Guidelines ルール「I.13: 配列を 1 つのポインターとして渡さない」を適用するのに役立ちます。 このルールは、静的な配列の型情報が、減衰から生ポインターに失われた場所を検出します。 zstring
型とczstring
型は除外されません。
C26481 と C26485 は、境界安全プロファイルのルールに由来しています。 これらのルールは、C++ Core Guidelines Checker の最初のリリースで実装されました。 これらは、生ポインターの安全ではない使用を回避するのに役立つので、生ポインター カテゴリに適用できます。
例
このサンプルでは、memcpy
への呼び出しで配列からポインターへの減衰に関する 2 つの警告が生成されます。
// c26485_bad.cpp
// compile using:
// set Esp.Extensions=CppCoreCheck.dll
// cl /W4 /EHsc /permissive- /analyze /analyze:plugin EspXEngine.dll /analyze:ruleset "%VSINSTALLDIR%\Team Tools\Static Analysis Tools\Rule Sets\CppCoreCheckBoundsRules.ruleset" c26485_bad.cpp
#include <cstring>
constexpr int array_length = 10;
int main() noexcept
{
int const from_array[array_length] = { 4, 3, 2, 1, 0, 9, 8, 7, 6, 5 };
int to_array[array_length] = {};
if (nullptr != memcpy(to_array, from_array, sizeof(int) * array_length))
return 0;
return 1;
}
この問題に対処するには、ポインター パラメーターを受け取る呼び出しを避け、境界情報を管理しないようにします。 多くの場合、このような関数を使用するとエラーが発生しやすくなります。 C++ 標準ライブラリの C ランタイム ライブラリ関数の呼び出しを優先します。 独自の関数でまたは gsl::span
または std::vector
を使用することを検討してください。 減衰したポインター型に明示的にキャストすると、警告が発生しませんが、バグのあるコードを防ぐことはできません。