Аннотирование поведения функции
Помимо аннотирования параметров функции и возвращаемых значений, можно аннотировать свойства всей функции.
Заметки о функциях
Следующие примечания применяются к функции в целом и описывают, как она работает и что должно выполняться.
Номер | Description |
---|---|
_Called_from_function_class_(name) |
Не является автономной; это предикат, который должен использоваться с примечанием _When_ . Дополнительные сведения см. в разделе "Указание времени и места применения заметки".Параметр name является произвольной строкой, которая также отображается в _Function_class_ заметке в объявлении некоторых функций. _Called_from_function_class_ возвращает ненулевое значение, если функция, которая в настоящее время анализируется, аннотирована с помощью _Function_class_ того же значения name ; в противном случае возвращается ноль. |
_Check_return_ |
Аннотирует возвращаемое значение и заявляет, что вызывающий объект должен его проверять. Средство проверки выдает ошибку, если функция вызывается в пустом контексте. |
_Function_class_(name) |
Параметр name является произвольной строкой, указанной пользователем. Он существует в пространстве имен, отличном от других пространств имен. Функция, указатель на функцию или, что наиболее полезно, тип указателя на функцию могут быть обозначены как принадлежащие к одному или нескольким классам функции. |
_Raises_SEH_exception_ |
Добавляет примечание к функции, которая всегда вызывает исключение структурированного обработчика исключений (SEH), при условии _When_ и _On_failure_ . Дополнительные сведения см. в разделе "Указание времени и места применения заметки". |
_Maybe_raises_SEH_exception_ |
Добавляет примечание к функции, которая может при необходимости вызывать SЕH исключение, при условии _When_ и _On_failure_ . |
_Must_inspect_result_ |
Заметит любое выходное значение, включая возвращаемое значение, параметры и глобальные значения. Анализатор выдает ошибку, если значение в объекте, к которому добавлено примечание, далее не проверяется. "Проверка" инспектирует, используется ли он в условном выражении, присвоен ли он параметру вывода или глобальному параметру или передается ли он как параметр. Для возвращаемых значений _Must_inspect_result_ подразумевается _Check_return_ . |
_Use_decl_annotations_ |
Может использоваться для определения функции (также известного как текст функции) вместо списка заметок в заголовке. При _Use_decl_annotations_ использовании заметки, отображаемые в заголовке области для той же функции, используются, как если бы они также присутствуют в определении с _Use_decl_annotations_ заметкой. |
Заметки об успешном выполнении и сбое
Функция может завершиться ошибкой. Когда это происходит, ее результаты могут быть неполными или могут отличаться от результатов в том случае, когда функция завершается успешно. Примечания в следующем списке предоставляют способы указания расширения функциональности при сбое. Чтобы использовать эти примечания, необходимо включить их для определения успешного завершения, поэтому требуется примечание _Success_
. Следует заметить, что NTSTATUS
и HRESULT
уже содержат примечание _Success_
, встроенное в них; однако, если указать собственное примечание _Success_
на NTSTATUS
или HRESULT
, оно переопределит встроенное примечание.
Номер | Description |
---|---|
_Always_(anno_list) |
Эквивалентно anno_list _On_failure_(anno_list) ; примечания в anno_list применяются вне зависимости от того, завершилась функция успехом или нет. |
_On_failure_(anno_list) |
Может использоваться только когда _Success_ также используется для добавления заметок к функции явно или неявно через _Return_type_success_ на typedef. Если примечание _On_failure_ присутствует в параметре функции или возвращаемом значении, каждое примечание в anno_list (anno) ведет себя так, как если бы оно было закодировано как _When_(!expr, anno) , где expr является параметром для обязательного примечания _Success_ . Это означает, что неявное приложение _Success_ ко всем постусловиям неприменимо для _On_failure_ . |
_Return_type_success_(expr) |
Может применяться к typedef. Указывает, что все функции, которые возвращают этот тип и явно не имеют _Success_ , аннотированы, как если бы они имели _Success_(expr) . _Return_type_success_ не может быть использован в функции или typedef указателя функции. |
_Success_(expr) |
expr является выражением, которое предоставляет rvalue. Если примечание _Success_ присутствует в объявлении или определении функции, каждое примечание (anno ) на функции и в постусловии ведет себя так, как если бы оно было закодировано как _When_(expr, anno) . Примечание _Success_ может быть использовано только для функции, не для ее параметров или типа возвращаемого значения. На функции может быть не более одного примечания _Success_ и оно не может быть в _When_ , _At_ или _Group_ . Дополнительные сведения см. в разделе "Указание времени и места применения заметки". |
См. также
- Использование аннотаций SAL для уменьшения количества дефектов в коде C/C++
- Основные сведения о языке SAL
- Создание примечаний к параметрам и возвращаемым значениям функций
- Аннотация структур и классов
- Аннотация поведения блокировки
- Указание времени и места применения примечания
- Встроенные функции
- Рекомендации и примеры