В чем разница между Deref а также Outptr SAL аннотации?
Также, когда вы используете различные типы Outptr аннотации типа _Outptr_result_buffer_all_ и _Outptr_result_buffer_?
SAL плохо документирован. Вам нужно посмотреть на sal.h
файл.
В чем разница между аннотациями SAL Deref и Outptr
Они одинаковы, за исключением того, что 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 _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);
Так что эта функция создает буфер с нулевым символом в конце _PBuffer
, Размер буфера находится в *_PBufferSizeInBytes
,
Других решений пока нет …