Аннотация параметров в языке Си

IN

Замена аннотаций IN и OUT спецификаторами типа.

void foo (IN int* buf);

void foo (const int* const buf);

Компилятор не позволит ни изменить сам указатель внутри функции, ни изменить значение массива.

OUT

void foo (OUT int* buf);

void foo (int* buf);

Для значений, которые необходимо инициализировать внутри функции, спецификатор использовать не получится. Это может создать некоторую проблему в том случае, если программист забудет указать спецификатор.

IN OUT

void foo (IN OUT int* buf);

void foo (int* const buf);

Позволяет указать, что входное значение функции является уже инициализированным, и внутри функции foo оно будет изменяться.

Как видно, аннотации параметров IN, OUT, IN OUT вполне заменяются спецификаторами типа, встроенными в язык. Это позволяет писать кроссплатформенный код с проверкой параметров.

С продвинутыми аннотациями увы, сложнее, так как у Microsoft есть Security Annotation Language (например _In_, _In_count), а в GCC используются атрибуты для функций (например __attribute__((alloc_size(2)))).