警告 C26403

重置或显式删除 owner<T> 指针“variable”(r.3)

所有者指针类似于唯一指针:它们拥有唯一资源,并管理资源的发布,或将其传输到其他所有者。 此检查验证本地所有者指针是否通过函数中的所有执行路径正确地维护了其资源。 如果资源未转移到另一个所有者,或者未发布资源,则检查器会发出警告,并指向指针变量声明。

有关详细信息,请参阅 C++ Core Guidelines

注解

  • 目前,此检查未提供无法发布资源的确切路径。 此行为在将来的版本中可能会得到改善。 可能很难找到要修补的确切位置。 更好的方法是尝试将复杂函数中的纯指针替换为唯一指针,以避免任何风险。

  • 检查可能会放弃过于复杂的函数,以免阻止代码分析。 通常,函数的复杂性应保持在一些合理的阈值下。 如果有明确需求,我们可以考虑向 C++ Core Guidelines 模块添加本地复杂性检查。 此限制适用于对数据流敏感的其他规则。

  • 仅当对指针进行 null 检查后,可能才会针对删除内存的明显误报情况触发警告。 这些误报是工具 API 的当前限制的结果,但将来可能会对其进行改进。

代码分析名称:RESET_OR_DELETE_OWNER

示例

错误处理过程中未清理:

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;