Свойство Microsoft SAL Deref=1 по отношению к параметру int?

Я пришел к мысли, что Microsoft SAL (Source Annotation Language) является хорошей вещью, и изучил язык и значение свойств аннотаций.

У меня есть общий вопрос об использовании свойства SAL "Deref" в связи с параметром "int". Позвольте мне проиллюстрировать мой вопрос с помощью SAL для функции isalpha(), взятой из файла включения ctype.h с Visual Studio 10:

[возвращаемое значение:SA_Post(MustCheck=SA_Yes)] int __cdecl isalpha([SA_Pre(Null=SA_No)] [SA_Pre(Deref=1,Valid=SA_Yes,Access=SA_Read)] int _C);

Если единственный параметр _C в "int", что означает "[SA_Pre (Deref = 1, Valid = SA_Yes, Access = SA_Read)]"? Как можно разыменовать int один раз (Deref=1) осмысленным образом?

Единственное объяснение, которое я могу придумать, состоит в том, что аннотация утверждает, что целое число является ссылкой на внутренний байтовый массив ctype. Как статический анализатор может воспользоваться этой аннотацией?

1 ответ

Решение

Выглядит так, что вы вставили предварительно обработанную версию объявления isalpha. Что я вижу в ctype.h:

_Check_return_ _CRT_JIT_INTRINSIC _CRTIMP int __cdecl isalpha(_In_ int _C);

_In_ разрешено для скалярных параметров (int и т. д.), чтобы позволить разработчикам явно выразить, что параметр является строго входным параметром. Это отчасти избыточно, но все же верно (в конце концов, вы не можете вернуть значение через скаляр передачи по значению).

Аннотация _In_ это макрос, который расширяется, как вы вставили выше, чтобы выразить семантику входного указателя. Статический анализатор распознает, когда _In_ применяется к скалярному параметру и игнорирует его, так как ни Null, ни Deref=1 не имеют большого смысла для int.

В любом другом контексте, помимо того, что является частью _In_ аннотация, Deref=1 для int не будет иметь смысла.

Как правило, лучше использовать _In_стиль синтаксиса, а не SA_Pre и SA_Post, если вы действительно не хотите смотреть на детали реализации, как это.

Другие вопросы по тегам