警告 C26400

请勿将包含 owner<T> 返回值的分配或函数调用结果分配给原始指针,请转而使用 owner<T> (i.11)

备注

此检查有助于强制实施“*规则 I.11: 永不通过原始指针(T*)转移所有权”,它是“R.3: 原始指针(T*)是非占有指针”规则的子集。 具体而言,它会对在原始指针类型的变量中保存调用结果的任何 operator new 调用发出警告。 如果向原始指针分配函数调用结果,则它还会对返回 gsl::owner<T> 的函数调用发出警告。 其观点是,应明确声明内存资源的所有权。 有关详细信息,请参阅 C++ Core Guidelines

如果声明变量时会立即分配资源,则修复此警告的最简单方法是使用 auto 声明。 如果无法进行此修复,建议使用 gsl::owner<T> 类型。 使用运算符 new 初始化的 auto 声明是“owner”,因为我们假设任何分配的结果是隐式的所有者指针。 我们将此假设转移到 auto 变量,并将其视为 owner<T>

如果此检查标记了返回 owner<T> 的函数调用,则可能指示代码中存在合法 bug。 基本上,它会指向代码泄露明确所有权概念的位置(也可能是资源本身)。

此规则当前仅检查局部变量。 如果分配给形参、全局变量、类成员等,则不会标记它们。 未来计划适当涵盖此类方案。

代码分析名称: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