警告 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