Замена аннотаций IN и OUT спецификаторами типа.
void foo (IN int* buf);
void foo (const int* const buf);
Компилятор не позволит ни изменить сам указатель внутри функции, ни изменить значение массива.
void foo (OUT int* buf);
void foo (int* buf);
Для значений, которые необходимо инициализировать внутри функции, спецификатор использовать не получится. Это может создать некоторую проблему в том случае, если программист забудет указать спецификатор.
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)))).