Предупреждения функции анализа кода для драйверов
В этом разделе перечислены и описаны предупреждения, которые сообщает анализ кода для драйверов при обнаружении возможной ошибки в коде драйвера. Обратите внимание, что некоторые предупреждения предназначены для кода в режиме ядра и могут игнорироваться при анализе драйверов в пользовательском режиме.
Анализ кода для драйверов сообщает о следующих типах предупреждений:
Общие предупреждения (6000–6999): потенциальные ошибки в синтаксисе C и C++ и общей практике написания кода. Описание этих предупреждений см. в разделе Анализ кода для предупреждений C/C++.
Предупреждения, относящиеся к Windows (28600-28799): эти предупреждения относятся к определенным шаблонам использования в Windows, но не относятся к драйверам.
Предупреждения, относящиеся к драйверу (28100–28199): ошибки при взаимодействии драйвера с приложением, с другими драйверами и операционной системой.
Ошибки заметок (28200-28299 и 36000-36999): эти предупреждения указывают на то, что заметка была неправильно закодирована или использована в неправильном контексте. В большинстве случаев наличие такого предупреждения указывает на то, что заметка не оказывает желаемого (или любого) эффекта.
Предупреждения о выделении памяти (30029–30035). Это предупреждения о выделении памяти.
В этом разделе
Раздел | Описание |
---|---|
предупреждение C28101: модуль Drivers вывел, что текущая функция не является правильным типом функции |
|
предупреждение C28110: драйверы должны защищать состояние оборудования с плавающей запятой. См. использование float |
|
предупреждение C28111: IRQL, в котором было сохранено состояние с плавающей запятой, не соответствует текущему коду IRQL (для этой операции восстановления). |
|
предупреждение: C28114: при копировании всей записи стека IRP некоторые поля инициализированы, которые должны быть очищены или обновлены. |
|
предупреждение C28120: функция не может вызываться на текущем уровне IRQ. Текущий уровень слишком низкий. |
|
предупреждение C28121: функция не может вызываться на текущем уровне IRQ. Текущий уровень слишком высок. |
|
предупреждение C28122: функция не может вызываться на низком уровне IRQ. Предыдущие вызовы функций не соответствуют этому ограничению. |
|
предупреждение C28123: функция не может вызываться на высоком уровне IRQ. Предыдущие вызовы функций не соответствуют этому ограничению. |
|
предупреждение C28124. Вызов метода приводит к тому, что уровень IRQ будет ниже минимально допустимого для анализируемой функции. |
|
предупреждение C28126: параметр AccessMode для ObReferenceObject* должен иметь значение IRP-RequestorMode> |
|
предупреждение C28127: функция, используемая в качестве подпрограммы, не совсем соответствует ожидаемому типу. |
|
предупреждение C28128: доступ к полю был сделан напрямую. Это должно быть сделано рутиной. |
|
предупреждение C28129: присвоено операнду, которое следует изменять только с помощью наборов битов и очистки |
|
предупреждение C28131: подпрограмма DriverEntry должна сохранить копию аргумента, а не указатель, так как диспетчер ввода-вывода освобождает буфер. |
|
предупреждение C28132: определение размера указателя |
|
предупреждение C28133: IoInitializeTimer лучше всего вызывать из AddDevice |
|
предупреждение C28134: тип тега пула должен быть целочисленным, а не строковым или строковым указателем |
|
предупреждение C28135. Если первый аргумент KeWaitForSingleObject является локальной переменной, параметр Mode должен иметь значение KernelMode. |
|
предупреждение C28139: аргумент должен точно соответствовать типу |
|
предупреждение C28141: аргумент приводит к тому, что уровень IRQ задается ниже текущего IRQL, и эту функцию нельзя использовать для этой цели. |
|
предупреждение C28143: подпрограмма диспетчеризации, которая вызывает IoMarkIrpPending, также должна возвращать STATUS_PENDING |
|
предупреждение C28144. В рамках процедуры отмены в точке выхода IRQL в Irp-CancelIrql> должен быть текущим IRQL. |
|
предупреждение C28145: непрозрачная структура MDL не должна изменяться драйвером |
|
предупреждение C28146: драйверы режима ядра должны использовать ntstrsafe.h, а не strsafe.h. Найдено в исходном файле |
|
предупреждение C28147: использование тега пула по умолчанию (kdD или mdW) для вызовов этой функции не позволяет использовать теги пула |
|
предупреждение C28150: функция приводит к тому, что уровень IRQ будет установлен выше максимального допустимого для анализируемой функции. |
|
предупреждение C28151: значение не является допустимым значением для IRQL |
|
предупреждение C28152: возврат функции, подобной AddDevice, неожиданно DO_DEVICE_INITIALIZING |
|
предупреждение C28153: значение для заметки IRQL из заметки не может быть оценено в этом контексте. |
|
предупреждение C28156: фактический IRQL несовместим с требуемым IRQL |
|
предупреждение C28157: IRQL никогда не восстанавливался |
|
предупреждение C28158: IRQL не сохранен |
|
предупреждение C28161: выход без получения права на использование плавающего оборудования |
|
предупреждение C28162: выход с сохранением права на использование оборудования с плавающей запятой |
|
предупреждение C28165: указатель функции класса не соответствует классу функции |
|
предупреждение C28166. Функция не восстанавливает irQL до текущего значения при входе функции и для этого требуется. |
|
предупреждение C28167. Функция изменяет IRQL и не восстанавливает IRQL перед выходом. Он должен иметь заметки, чтобы отразить изменения, или IRQL должен быть восстановлен. |
|
предупреждение C28168: функция dispatch не имеет заметки Dispatch_type , соответствующей этой записи таблицы диспетчеризации |
|
предупреждение C28169: функция dispatch не имеет Dispatch_type заметок |
|
предупреждение C28170: функция была объявлена в сегменте с разбивкой на страницы, но ни PAGED_CODE, ни PAGED_CODE_LOCKED не найдены |
|
предупреждение C28171: функция содержит несколько экземпляров PAGED_CODE или PAGED_CODE_LOCKED |
|
предупреждение C28172: функция имеет PAGED_CODE или PAGED_CODE_LOCKED, но не объявлена в сегменте с разбивкой на страницы |
|
Предупреждение C28173: текущая функция, как представляется, неправильно адаптируется к физической памяти свыше 4 ГБ |
|
предупреждение C28175: драйвер не должен обращаться к элементу структуры |
|
предупреждение C28176: драйвер не должен изменять элемент структуры |
|
предупреждение C28177: функция аннотирована несколькими классами функций. Все, кроме одного, будут проигнорированы. |
|
предупреждение C28260: обнаружена синтаксическая ошибка в заметках при анализе свойства внутри функции |
|
Обнаружена синтаксическая ошибка в заметках для свойства в функции . |
|
предупреждение C28268: класс функции в функции не соответствует классу функции в определении типа, используемом здесь |
|
Предупреждение C28601: избегайте блокировки на HWND_BROADCAST |
|
Предупреждение C28602: избегайте вызова SendMessageTimeout с HWND_BROADCAST |
|
Предупреждение C28604: избегайте вызова SendMessageTimeout с SMTO_ABORTIFHUNG со временем ожидания 0 |
|
предупреждение C28615: должен вызывать _resetstkoflw в блоке __except() при вызове _alloca в блоке __try. Не вызывайте _resetstkoflw из блока catch() |
|
предупреждение C28616: многопоточное условие антивирусной программы |
|
предупреждение C28617: не используйте возвращаемое значение _beginthread(). Вместо этого используйте _beginthreadex() |
|
предупреждение C28623: приведение координат GetMessagePos() без знака. Используйте GET_X_LPARAM/GET_Y_LPARAM вместо LOWORD/HIWORD |
|
предупреждение C28624: нет вызова Release() для сопоставления увеличенной ссылки из LResultFromObject |
|
предупреждение C28625: вызов функции, используемый для очистки конфиденциальных данных, будет оптимизирован |
|
предупреждение C28636: вызов LocalFree для неразделяемого указателя, полученного из вызовов GetSecurityDescriptorOwner/Group/Dacl/Sacl |
|
предупреждение C28637: вызов функции в глобальном инициализаторе небезопасн |
|
предупреждение C28638: заглушка задержки функции отсутствует соответствующее объявление |
|
предупреждение C28639: вызов дескриптора закрытия со строкой |
|
предупреждение C28640: заглушка задержки функции должна быть статической функцией |
|
предупреждение C28644: возвращаемое значение из DPA_InsertPtr не проверяется |
|
предупреждение C28645: MessageBox был вызван с помощью символа вопросительного знака, который больше не рекомендуется |
|
предупреждение C28648: PulseEvent является ненадежной функцией |
|
предупреждение C28649: автоматические или глобальные массивы стека никогда не имеют значения NULL |
|
предупреждение C28650: тип, для которого используется !0, не рассматривает его как случай сбоя. Возвращает значение состояния, например ! Значение TRUE не совпадает с возвратом значения состояния, указывающего на сбой. |
|
предупреждение C28651: статический инициализатор вызывает копирование на страницах записи из-за указателей функции-члена |
|
предупреждение C28652: Статический инициализатор вызывает копирование на страницах записи из-за перегрузки побитовых операторов |
|
предупреждение C28714: приведение между семантически разными целочисленными типами |
|
предупреждение C28715: приведение между семантически разными целочисленными типами |
|
предупреждение C28716: приведение между семантически разными целочисленными типами с помощью компилятора |
|
предупреждение C28717: недопустимый тип VARIANT |
|
предупреждение C28718: неаннотированный буфер |
|
предупреждение C28719: запрещенное использование API |
|
Предупреждение C28720: запрещенное использование API |
|
Предупреждение C28721: нерекомендуемая архитектура счетчика производительности |
|
предупреждение C28722: неаннотированный буфер в объявлении функции |
|
предупреждение C28723: неаннотированный буфер в определении функции без соответствующего объявления |
|
предупреждение C28725: используйте Watson вместо setUnhandledExceptionFilter |
|
Предупреждение C28726: запрещенное использование API |
|
Предупреждение C28727: запрещенное использование API |
|
предупреждение C28728: запрещенное использование API |
|
предупреждение C28730: возможное назначение "\0" непосредственно указателю. |
|
предупреждение C28735: запрещено использование багрового API |
|
предупреждение C28736: использование запрещенного аргумента API |
|
предупреждение C28740: буфер без знака без подписи |
|
предупреждение C28741: неаннотированный буфер в функции |
|
предупреждение C28742: буфер без аннотации в функции |
|
предупреждение C28750: запрещено использование lstrlen и его вариантов |
|
предупреждение C28751: запрещено использование ExAllocatePool и его вариантов |
|
предупреждение C28752: запрещено использование API kernel32 или advapi32 |
|
предупреждение C28753: использование неопределенного порядка оценки параметров |
|
предупреждение C30029: вызов функции выделения памяти, которая запрашивает исполняемую память |
|
предупреждение C30030: вызов функции выделения памяти и передача параметра, указывающего исполняемую память |
|
предупреждение C30031: вызов функции выделения памяти и передача параметра, указывающего исполняемую память |
|
предупреждение C30032: вызов функции выделения памяти и принудительное выполнение запроса исполняемой памяти с помощью директивы POOL_NX_OPTOUT |
|
предупреждение C30033: выделение исполняемого файла обнаружено в драйвере, скомпилированном с POOL_NX_OPTIN. Этот драйвер был определен для загрузки во время выполнения другим драйвером. Убедитесь, что драйвер загрузки вызывает ExInitializeDriverRuntime(DrvRtPoolNxOptIn) в своем DriverEntry. |
|
предупреждение C30034: передача значения флага функции выделения, которая может привести к выделению исполняемой памяти. Убедитесь, что функция выделения не запрашивает форму исполняемого пула. |
|
предупреждение C30035: выполнен вызов функции, которая должна быть выполнена из функции инициализации (например, DriverEntry() или DllInitialize()). PREfast не удалось определить, был ли вызов выполнен из функции инициализации. |
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по