SAL 注释:std::shared_ptr 的 _Ret_maybenull_

Posted

技术标签:

【中文标题】SAL 注释:std::shared_ptr 的 _Ret_maybenull_【英文标题】:SAL Annotations: _Ret_maybenull_ for std::shared_ptr 【发布时间】:2017-11-29 11:15:41 【问题描述】:

是否可以用 SAL 注释我的智能指针返回函数?

_Ret_maybenull_ std::shared_ptr<MyClass> getMyObject();

给我警告

警告 C6504:无效注释:“Null”属性只能用于指针、指向成员的指针、数组或引用类型的值:函数“getMyObject”返回。实际类型 'class std::shared_ptr'。

写这个时没有一个警告:

auto a = getMyObject();
a->foo();

【问题讨论】:

lastsector.wordpress.com/2013/09/08/… 【参考方案1】:

就像这个警告说_Ret_maybenull_ 不能应用于任何类型的智能指针,只能应用于原始类型。作为替代方案,此函数的注释可以是_Check_return_ 和智能指针的operator -&gt; 的注释(以及其他操作符取消引用存储的指针)_Check_return_ _Ret_notnull_。不过,您可能需要为智能指针编写自己的包装器才能使用它。

【讨论】:

谢谢。可惜我们前段时间改用智能指针来改进我们的代码库,现在它阻碍了我们进行静态分析。我正在犹豫是否为指针的包装器编写一个包装器,特别是因为 std 智能指针类的测试比我们自己编写的要好得多。 @PhilLab 这看起来像是公共实现继承和using parent::parent; 的工作——然后您可以使用带注释的简单转发来隐藏operator-&gt;

以上是关于SAL 注释:std::shared_ptr 的 _Ret_maybenull_的主要内容,如果未能解决你的问题,请参考以下文章

这是 std::shared_ptr 的正确用法吗?

`std::optional` 比 `std::shared_ptr` 和 `std::unique_ptr` 有啥优势?

为啥我不能在 C++0x 中对 std::shared_ptr 的向量执行 std::copy?

这是 std::vector 和 std::shared_ptr 内存泄漏的错误吗?

无法将参数 1 从 'std::shared_ptr<ChaseState>' 转换为 'std::shared_ptr<State<Cow>>

std::shared_ptr 和初始化列表