Поделиться через


Заметки заголовка

[В этом разделе описываются заметки, поддерживаемые заголовками Windows через Windows 7. При разработке для Windows 8 следует использовать заметки, описанные в заметках SAL.]

Заметки заголовков описывают, как функция использует свои параметры и возвращаемое значение. Эти заметки были добавлены во многие файлы заголовков Windows, чтобы обеспечить правильность вызова API Windows. Если вы включите анализ кода, который доступен начиная с Visual Studio 2005, компилятор создаст предупреждения уровня 6000, если вы не вызываете эти функции для каждого использования, описанного в заметках. Вы также можете добавить эти заметки в собственный код, чтобы убедиться, что он вызывается правильно. Сведения о включении анализа кода в Visual Studio см. в документации по вашей версии Visual Studio.

Эти заметки определены в Specstrings.h. Они основаны на примитивах, которые являются частью стандартного языка заметки (SAL) и реализуются с помощью _declspec("SAL_*").

Существует два класса заметок: буферные заметки и дополнительные заметки.

Заметки буфера

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

Размер буфера Описание
(размер)
Указывает общий размер буфера. Использование с _bcount и _ecount; не используйте _part. Это значение является доступным пространством; Это может быть меньше выделенного пространства.
(размер,длина)
Задает общий размер и инициализированную длину буфера. Используйте _bcount_part и _ecount_part. Общий размер может быть меньше выделенного пространства.
Единицы размера буфера Описание
_bcount
Размер буфера составляет байты.
_ecount
Размер буфера находится в элементах.
Направление Описание
_in
Функция считывает из буфера. Вызывающий объект предоставляет буфер и инициализирует его.
_inout
Функция считывает данные и записывается в буфер. Вызывающий объект предоставляет буфер и инициализирует его. При использовании с _deref буфер может быть перераспределирован функцией.
_out
Функция записывается в буфер. Если используется для возвращаемого значения или с _deref, функция предоставляет буфер и инициализирует его. В противном случае вызывающий объект предоставляет буфер и инициализирует его.
Косвенность Описание
_deref
Расшифровка параметра для получения указателя буфера. Этот параметр может не быть null.
_deref_opt
Расшифровка параметра для получения указателя буфера. Этот параметр может быть NULL.
Инициализация Описание
_full
Функция инициализирует весь буфер. Используйте только с выходными буферами.
_part
Функция инициализирует часть буфера и явно указывает, сколько. Используйте только с выходными буферами.
Обязательный или необязательный буфер Описание
_opt
Этот параметр может быть NULL.

В следующем примере показаны заметки для функции GetModuleFileName. Параметр hModule является необязательным входным параметром. Параметр lpFilename является выходным параметром; его размер в символах задается параметром nSize и его длина включает null-конечный символ. Параметр nSize является входным параметром.

DWORD
WINAPI
GetModuleFileName(
    __in_opt HMODULE hModule,
    __out_ecount_part(nSize, return + 1) LPTSTR lpFilename,
    __in DWORD nSize
    );

Ниже приведены заметки, определенные в Specstrings.h. Используйте сведения в таблицах выше, чтобы интерпретировать их смысл.

__bcount(размер)
__bcount_opt(размер)
__deref_bcount(размер)
__deref_bcount_opt(размер)
__deref_ecount(размер)
__deref_ecount_opt(размер)
__deref_in
__deref_in_bcount(размер)
__deref_in_bcount_opt(размер)
__deref_in_ecount(размер)
__deref_in_ecount_opt(размер)
__deref_in_opt
__deref_inout
__deref_inout_bcount(размер)
__deref_inout_bcount_full(размер)
__deref_inout_bcount_full_opt(размер)
__deref_inout_bcount_opt(размер)
__deref_inout_bcount_part(размер,длина)
__deref_inout_bcount_part_opt(размер,длина)
__deref_inout_ecount(размер)
__deref_inout_ecount_full(размер)
__deref_inout_ecount_full_opt(размер)
__deref_inout_ecount_opt(размер)
__deref_inout_ecount_part(размер,длина)
__deref_inout_ecount_part_opt(размер,длина)
__deref_inout_opt
__deref_opt_bcount(размер)
__deref_opt_bcount_opt(размер)
__deref_opt_ecount(размер)
__deref_opt_ecount_opt(размер)
__deref_opt_in
__deref_opt_in_bcount(размер)
__deref_opt_in_bcount_opt(размер)
__deref_opt_in_ecount(размер)
__deref_opt_in_ecount_opt(размер)
__deref_opt_in_opt
__deref_opt_inout
__deref_opt_inout_bcount(размер)
__deref_opt_inout_bcount_full(размер)
__deref_opt_inout_bcount_full_opt(размер)
__deref_opt_inout_bcount_opt(размер)
__deref_opt_inout_bcount_part(размер,длина)
__deref_opt_inout_bcount_part_opt(размер,длину)
__deref_opt_inout_ecount(размер)
__deref_opt_inout_ecount_full(размер)
__deref_opt_inout_ecount_full_opt(размер)
__deref_opt_inout_ecount_opt(размер)
__deref_opt_inout_ecount_part(размер,длина)
__deref_opt_inout_ecount_part_opt(размер,длину)
__deref_opt_inout_opt
__deref_opt_out
__deref_opt_out_bcount(размер)
__deref_opt_out_bcount_full(размер)
__deref_opt_out_bcount_full_opt(размер)
__deref_opt_out_bcount_opt(размер)
__deref_opt_out_bcount_part(размер,длина)
__deref_opt_out_bcount_part_opt(размер,длина)
__deref_opt_out_ecount(размер)
__deref_opt_out_ecount_full(размер)
__deref_opt_out_ecount_full_opt(размера)
__deref_opt_out_ecount_opt(размер)
__deref_opt_out_ecount_part(размер,длина)
__deref_opt_out_ecount_part_opt(размер,длина)
__deref_opt_out_opt
__deref_out
__deref_out_bcount(размер)
__deref_out_bcount_full(размер)
__deref_out_bcount_full_opt(размер)
__deref_out_bcount_opt(размер)
__deref_out_bcount_part(размер,длина)
__deref_out_bcount_part_opt(размер,длину)
__deref_out_ecount(размер)
__deref_out_ecount_full( размер)
__deref_out_ecount_full_opt(размер)
__deref_out_ecount_opt(размер)
__deref_out_ecount_part(размер, длина)
__deref_out_ecount_part_opt(размер,длина)
__deref_out_opt
__ecount(размер)
__ecount_opt(размер)
__в
__in_bcount(размер)
__in_bcount_opt(размер)
__in_ecount(размер)
__in_ecount_opt(размер)
__in_opt
__inout
__inout_bcount(размер)
__inout_bcount_full(размер)
__inout_bcount_full_opt(размер)
__inout_bcount_opt(размер)
__inout_bcount_part(размер,длина)
__inout_bcount_part_opt(размер, длина)
__inout_ecount(размер)
__inout_ecount_full(размер)
__inout_ecount_full_opt(размер)
__inout_ecount_opt(размер)
__inout_ecount_part(размер,длина)
__inout_ecount_part_opt(размер,длина)
__inout_opt
__вне
__out_bcount(размер)
__out_bcount_full(размер)
__out_bcount_full_opt(размер)
__out_bcount_opt(размер)
__out_bcount_part(размер,длина)
__out_bcount_part_opt(размер,длина)
__out_ecount(размер)
__out_ecount_full(размер)
__out_ecount_full_opt(размер)
__out_ecount_opt(размер)
__out_ecount_part(размер,длина)
__out_ecount_part_opt(размер,длина)
__out_opt

Дополнительные заметки

Дополнительные заметки предоставляют дополнительные сведения о параметре или возвращаемом значении. Каждый параметр или возвращаемое значение может использовать ноль или одну расширенную заметку.

Аннотация Описание
__blocksOn(ресурса)
Блоки функций указанного ресурса.
__callback
Функцию можно использовать в качестве указателя функции.
__checkReturn
Вызывающие должны проверить возвращаемое значение.
__format_string
Параметр — это строка, содержащая маркеры стиля печати %.
__in_awcount(экспр,размер)
Если выражение имеет значение true при выходе, размер входного буфера указывается в байтах. Если выражение равно false, размер указывается в элементах.
__nullnullterminated
К буферу можно получить доступ до первой последовательности двух null символов или указателей.
__nullterminated
К буферу можно получить доступ до первого null символа или указателя.
__out_awcount(экспр,размер)
Если выражение имеет значение true при выходе, размер выходного буфера указывается в байтах. Если выражение равно false, размер указывается в элементах.
__override
Указывает поведение переопределения в стиле C#для виртуальных методов.
__reserved
Параметр зарезервирован для дальнейшего использования и должен быть равен нулю или NULL.
__success(expr)
Если выражение имеет значение true при выходе, вызывающий объект может полагаться на все гарантии, указанные другими заметками. Если выражение равно false, вызывающий объект не может полагаться на гарантии. Эта заметка автоматически добавляется в функции, возвращающие значение HRESULT.
__typefix(ctype)
Обрабатывает параметр как указанный тип, а не его объявленный тип.

В следующих примерах показаны буфер и расширенные заметки для DeleteTimerQueueTimer, FreeEnvironmentStringsи функции UnhandledExceptionFilter.

__checkReturn
BOOL
WINAPI
DeleteTimerQueueTimer(
    __in_opt HANDLE TimerQueue,
    __in     HANDLE Timer,
    __in_opt HANDLE CompletionEvent
    );

BOOL
WINAPI
FreeEnvironmentStrings(
    __in __nullnullterminated LPTCH
    );

__callback
LONG
WINAPI
UnhandledExceptionFilter(
    __in struct _EXCEPTION_POINTERS *ExceptionInfo
    );

заметки SAL

пошаговое руководство. Анализ кода C/C++ для дефектов