次の方法で共有


警告 C26485

式 'array-name': ポインターの減衰 (bounds.3) に対する配列はありません。

解説

C26481 と同様に、このチェックによって C++ Core Guidelines ルール「I.13: 配列を 1 つのポインターとして渡さない」を適用するのに役立ちます。 このルールは、静的な配列の型情報が、減衰から生ポインターに失われた場所を検出します。 型 zstringczstring 型は除外されません。

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 を使用することを検討してください。 減衰したポインター型に明示的にキャストすると、警告が発生しませんが、バグのあるコードを防ぐことはできません。