경고 C26485

식 'array-name': 포인터 감쇠(bounds.3)에 대한 배열이 없습니다.

설명

C26481과 마찬가지로 이 검사 C++ 핵심 지침 규칙 I.13을 적용하는 데 도움이 됩니다. 배열을 단일 포인터로 전달하지 마세요. 규칙은 정적 배열 형식 정보가 감쇠에서 원시 포인터로 손실되는 위치를 검색합니다. 및 czstring 형식은 zstring 제외되지 않습니다.

C26481 및 C26485는 경계 금고ty 프로필 규칙에서 제공됩니다. 이러한 규칙은 C++ 핵심 지침 검사기의 첫 번째 릴리스에서 구현되었습니다. 원시 포인터의 안전하지 않은 사용을 방지하는 데 도움이 되므로 원시 포인터 범주에 적용할 수 있습니다.

예시

이 샘플에서는 호출 시 배열에서 포인터 감쇠에 대한 두 가지 경고가 발생합니다 memcpy.

// 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 사용하는 것이 좋습니다. 감쇠된 포인터 형식으로의 명시적 캐스트는 경고를 방지하지만 버그 코드를 방지하지는 않습니다.