_Deref_ 和 _Outptr_ sal 注释

Mit*_*hun 3 c c++ annotations sal

DerefOutptr SAL 注释之间有什么区别?另外,什么时候使用不同类型的Outptr注释,例如 _Outptr_result_buffer_all_ 和 _Outptr_result_buffer_?

Dan*_*ose 5

SAL 的记录很少。您需要查看该sal.h文件。

Deref 和 Outptr SAL 注释之间有什么区别

它们是相同的,只是Deref注释来自 SAL 1,Outptr来自 SAL 2(可以表达更多)。因此Deref已被弃用。

另外,什么时候使用不同类型的 Outptr 注释,例如 _Outptr_result_buffer_all_ 和 _Outptr_result_buffer_?

引用sal.h:

Outptr:返回的变量是指针类型(因此 param 是指针到指针类型)。被调用的函数提供/分配空间。

看源码,_Outptr_result_buffer_几乎_Outptr_result_buffer_all_是一样的。您提供将要分配的元素数量作为参数(如果恰好是一个元素,请使用_Outptr_)。不同之处在于,前者意味着元素可以被调用者写入(隐式地它们也是可读的),而后者意味着元素只能读取。

查看 C 运行时源代码,only_Outptr_result_buffer_在很少的地方使用,例如。对于在以下位置创建的缓冲区_dupenv_s

_Check_return_opt_ _CRTIMP errno_t __cdecl _dupenv_s(
    Outptr_result_buffer_maybenull_(*_PBufferSizeInBytes) _Outptr_result_z_ char **_PBuffer,
    _Out_opt_ size_t * _PBufferSizeInBytes,
    _In_z_ const char * _VarName);
Run Code Online (Sandbox Code Playgroud)

所以这个函数在 中创建一个(以 null 终止的)缓冲区_PBuffer。缓冲区的大小可在 中找到*_PBufferSizeInBytes