Свойство Microsoft SAL Deref = 1 по отношению к параметру int? - PullRequest
0 голосов
/ 07 июля 2011

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

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

[ReturnValue: SA_Post (MustCheck = SA_Yes)] int __cdecl ISALPHA ([SA_Pre (Нуль = SA_No)] [SA_Pre (Deref = 1, Допустимый = SA_Yes, Доступ = SA_Read)] int _C);

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

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

1 Ответ

1 голос
/ 25 ноября 2011

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...