атрибут partial_ignore
Атрибут ACF [partial_ignore] определяет специализированную версию указателей [unique] , которая предоставляет необязательную семантику.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ partial_ignore [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
При создании функции обычно пользователи могут указывать указатель, отличный от NULL , на необязательные возвращаемые данные, часто называемые необязательным указателем выхода. Память, на которую указывает пользователь, обычно не требуется для инициализации. Этот метод представляет проблему, когда функция используется через RPC.
Если необязательный указатель на выход является допустимым, но указывает на неинициализированные данные, RPC пытается маршалировать эти данные и отправить их на сервер, что может привести к сбою маршалинга и прерыванию вызова. Даже в случае успешного маршалинга на сервер отправляется потенциально большой объем бесполезных данных.
Эти проблемы решаются путем пометки указателя как [in, out, unique, partial_ignore]. Должны присутствовать все четыре атрибута. Когда указатель [partial_ignore] маршалируется на стороне клиента, на сервер отправляются только данные, показывающие, имеет ли указатель значение NULL. Если указатель не равен NULL, подпрограмма на стороне сервера получает допустимый указатель на блок памяти, который инициализирован нулями. Если указатель равен NULL, подпрограмма на стороне сервера получает указатель NULL .
В этой ситуации максимальный размер указателя должен быть четко определен во время компиляции или на основе входных параметров, так как серверу необходимо выделить место для расположения памяти, на которое указывает указатель. Например, простой указатель [string] не имеет четко определенного размера, так как строка неявно завершается символом NULL. В этом случае указание максимального размера строки путем добавления атрибута [size_is] обеспечит четко определенное требование к размеру.
/* The MoveLeft function will move one position to the left and optionally return the previous position */
void MoveLeft([in, out, unique, partial_ignore] long *pPrevPosition);