警告 C26485

表达式“array-name”:无数组到指针衰减 (bounds.3)。

备注

C26481 一样,此检查有助于强制实施 C++ Core Guidelines 规则 I.13:不要将数组作为单个指针传递。 该规则检测静态数组类型信息衰减为原始指针的位置。 不会排除 zstringczstring 类型。

C26481 和 C26485 来自边界安全配置文件规则。 C++ Core Guidelines 检查器的第一个版本实现了这些规则。 它们适用于原始指针类别,因为它们有助于避免不安全使用原始指针。

示例

此示例在 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::spanstd::vector。 显式强制转换为已衰减的指针类型可以防止发出警告,但不会防止出错的代码。