如何解决替换“operator new”时发出警告 (C28251):“new”的注释不一致,此实例没有注释
我正在尝试替换 Visual Studio 和 C++ 中的全局 new 运算符。这是我的代码(为简单起见,仅显示了一个新运算符):
void* operator new(size_t _Size)
{
// Do something
}
它工作正常,但是 Visual Studio 在为我的项目运行代码分析时给我一个警告:
warning C28251: Inconsistent annotation for 'new': this instance has no annotations. The first user-provided annotation on this built-in function is at line vcruntime_new.h(48).
按照 IntelliSense 警告中的建议,使用 vcruntime_new.h 中的注释替换我的 operator new
可以解决警告:
_NODISCARD _Ret_notnull_ _Post_writable_byte_size_(_Size) _VCRT_ALLOCATOR
void* __cdecl operator new(size_t _Size)
{
// Do something
}
- 将 vcruntime_new.h 中的注释用于我自己的替换代码(如上所示)是否安全?
- 这种变化的后果是什么?
- 是否有特殊用例因为注释而不能像以前一样使用“新运算符”?
- 为什么需要进行这种更改?
编辑:
- 我是否正确,注释不会更改生成的二进制文件中的任何内容,并且仅用于静态代码分析? (除了
__cdecl
,它改变了汇编程序,但我猜它应该是标准的?)
解决方法
这适用于 _Ret_notnull_
和 _Post_writable_byte_size_(_Size)
:
将 vcruntime_new.h 中的注释用于我自己的替换代码(如上所示)是否安全?
是的,只要您的操作符 new
在注释中实际遵循这些规则。它可能不会跟在 _Ret_notnull_
之后(例如不抛出 new
返回 nullptr
),tough 通常会。但它应该跟在 _Post_writable_byte_size_(_Size)
之后,因为 operator new
是必需的。
这种变化的后果是什么?
注解可能有助于 Visual Studio Code Analysis 查明错误,但会使您使用非标准的东西,使您的程序不那么可移植且不那么清晰。
是否有特殊用例因为注释而不能像以前那样使用“新运算符”?
没有
为什么需要这种改变?
因为您想避免该警告而不是使其静音。
我是否正确,注释不会更改生成的二进制文件中的任何内容,并且仅用于静态代码分析? (除了 __cdecl,它改变了汇编程序,但我猜它应该是标准的?)
正确。甚至优化器都不会使用它(优化器会使用 __assume
、__restrict
和其他与静态分析分开的注释)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。