Предупреждения функции анализа кода для драйверов

В этом разделе перечислены и описаны предупреждения, которые сообщает анализ кода для драйверов при обнаружении возможной ошибки в коде драйвера. Обратите внимание, что некоторые предупреждения предназначены для кода в режиме ядра и могут игнорироваться при анализе драйверов в пользовательском режиме.

Анализ кода для драйверов сообщает о следующих типах предупреждений:

  • Общие предупреждения (6000–6999): потенциальные ошибки в синтаксисе C и C++ и общей практике написания кода. Описание этих предупреждений см. в разделе Анализ кода для предупреждений C/C++.

  • Предупреждения, относящиеся к Windows (28600-28799): эти предупреждения относятся к определенным шаблонам использования в Windows, но не относятся к драйверам.

  • Предупреждения, относящиеся к драйверу (28100–28199): ошибки при взаимодействии драйвера с приложением, с другими драйверами и операционной системой.

  • Ошибки заметок (28200-28299 и 36000-36999): эти предупреждения указывают на то, что заметка была неправильно закодирована или использована в неправильном контексте. В большинстве случаев наличие такого предупреждения указывает на то, что заметка не оказывает желаемого (или любого) эффекта.

  • Предупреждения о выделении памяти (30029–30035). Это предупреждения о выделении памяти.

В этом разделе

Раздел Описание

C28101

предупреждение C28101: модуль Drivers вывел, что текущая функция не является правильным типом функции

C28110

предупреждение C28110: драйверы должны защищать состояние оборудования с плавающей запятой. См. использование float

C28111

предупреждение C28111: IRQL, в котором было сохранено состояние с плавающей запятой, не соответствует текущему коду IRQL (для этой операции восстановления).

C28114

предупреждение: C28114: при копировании всей записи стека IRP некоторые поля инициализированы, которые должны быть очищены или обновлены.

C28120

предупреждение C28120: функция не может вызываться на текущем уровне IRQ. Текущий уровень слишком низкий.

C28121

предупреждение C28121: функция не может вызываться на текущем уровне IRQ. Текущий уровень слишком высок.

C28122

предупреждение C28122: функция не может вызываться на низком уровне IRQ. Предыдущие вызовы функций не соответствуют этому ограничению.

C28123

предупреждение C28123: функция не может вызываться на высоком уровне IRQ. Предыдущие вызовы функций не соответствуют этому ограничению.

C28124

предупреждение C28124. Вызов метода приводит к тому, что уровень IRQ будет ниже минимально допустимого для анализируемой функции.

C28126

предупреждение C28126: параметр AccessMode для ObReferenceObject* должен иметь значение IRP-RequestorMode>

C28127

предупреждение C28127: функция, используемая в качестве подпрограммы, не совсем соответствует ожидаемому типу.

C28128

предупреждение C28128: доступ к полю был сделан напрямую. Это должно быть сделано рутиной.

C28129

предупреждение C28129: присвоено операнду, которое следует изменять только с помощью наборов битов и очистки

C28131

предупреждение C28131: подпрограмма DriverEntry должна сохранить копию аргумента, а не указатель, так как диспетчер ввода-вывода освобождает буфер.

C28132

предупреждение C28132: определение размера указателя

C28133

предупреждение C28133: IoInitializeTimer лучше всего вызывать из AddDevice

C28134

предупреждение C28134: тип тега пула должен быть целочисленным, а не строковым или строковым указателем

C28135

предупреждение C28135. Если первый аргумент KeWaitForSingleObject является локальной переменной, параметр Mode должен иметь значение KernelMode.

C28139

предупреждение C28139: аргумент должен точно соответствовать типу

C28141

предупреждение C28141: аргумент приводит к тому, что уровень IRQ задается ниже текущего IRQL, и эту функцию нельзя использовать для этой цели.

C28143

предупреждение C28143: подпрограмма диспетчеризации, которая вызывает IoMarkIrpPending, также должна возвращать STATUS_PENDING

C28144

предупреждение C28144. В рамках процедуры отмены в точке выхода IRQL в Irp-CancelIrql> должен быть текущим IRQL.

C28145

предупреждение C28145: непрозрачная структура MDL не должна изменяться драйвером

C28146

предупреждение C28146: драйверы режима ядра должны использовать ntstrsafe.h, а не strsafe.h. Найдено в исходном файле

C28147

предупреждение C28147: использование тега пула по умолчанию (kdD или mdW) для вызовов этой функции не позволяет использовать теги пула

C28150

предупреждение C28150: функция приводит к тому, что уровень IRQ будет установлен выше максимального допустимого для анализируемой функции.

C28151

предупреждение C28151: значение не является допустимым значением для IRQL

C28152

предупреждение C28152: возврат функции, подобной AddDevice, неожиданно DO_DEVICE_INITIALIZING

C28153

предупреждение C28153: значение для заметки IRQL из заметки не может быть оценено в этом контексте.

C28156

предупреждение C28156: фактический IRQL несовместим с требуемым IRQL

C28157

предупреждение C28157: IRQL никогда не восстанавливался

C28158

предупреждение C28158: IRQL не сохранен

C28161

предупреждение C28161: выход без получения права на использование плавающего оборудования

C28162

предупреждение C28162: выход с сохранением права на использование оборудования с плавающей запятой

C28165

предупреждение C28165: указатель функции класса не соответствует классу функции

C28166

предупреждение C28166. Функция не восстанавливает irQL до текущего значения при входе функции и для этого требуется.

C28167

предупреждение C28167. Функция изменяет IRQL и не восстанавливает IRQL перед выходом. Он должен иметь заметки, чтобы отразить изменения, или IRQL должен быть восстановлен.

C28168

предупреждение C28168: функция dispatch не имеет заметки Dispatch_type , соответствующей этой записи таблицы диспетчеризации

C28169

предупреждение C28169: функция dispatch не имеет Dispatch_type заметок

C28170

предупреждение C28170: функция была объявлена в сегменте с разбивкой на страницы, но ни PAGED_CODE, ни PAGED_CODE_LOCKED не найдены

C28171

предупреждение C28171: функция содержит несколько экземпляров PAGED_CODE или PAGED_CODE_LOCKED

C28172

предупреждение C28172: функция имеет PAGED_CODE или PAGED_CODE_LOCKED, но не объявлена в сегменте с разбивкой на страницы

C28173

Предупреждение C28173: текущая функция, как представляется, неправильно адаптируется к физической памяти свыше 4 ГБ

C28175

предупреждение C28175: драйвер не должен обращаться к элементу структуры

C28176

предупреждение C28176: драйвер не должен изменять элемент структуры

C28177

предупреждение C28177: функция аннотирована несколькими классами функций. Все, кроме одного, будут проигнорированы.

C28260

предупреждение C28260: обнаружена синтаксическая ошибка в заметках при анализе свойства внутри функции

C28266

Обнаружена синтаксическая ошибка в заметках для свойства в функции .

C28268

предупреждение C28268: класс функции в функции не соответствует классу функции в определении типа, используемом здесь

C28601

Предупреждение C28601: избегайте блокировки на HWND_BROADCAST

C28602

Предупреждение C28602: избегайте вызова SendMessageTimeout с HWND_BROADCAST

C28604

Предупреждение C28604: избегайте вызова SendMessageTimeout с SMTO_ABORTIFHUNG со временем ожидания 0

C28615

предупреждение C28615: должен вызывать _resetstkoflw в блоке __except() при вызове _alloca в блоке __try. Не вызывайте _resetstkoflw из блока catch()

C28616

предупреждение C28616: многопоточное условие антивирусной программы

C28617

предупреждение C28617: не используйте возвращаемое значение _beginthread(). Вместо этого используйте _beginthreadex()

C28623

предупреждение C28623: приведение координат GetMessagePos() без знака. Используйте GET_X_LPARAM/GET_Y_LPARAM вместо LOWORD/HIWORD

C28624

предупреждение C28624: нет вызова Release() для сопоставления увеличенной ссылки из LResultFromObject

C28625

предупреждение C28625: вызов функции, используемый для очистки конфиденциальных данных, будет оптимизирован

C28636

предупреждение C28636: вызов LocalFree для неразделяемого указателя, полученного из вызовов GetSecurityDescriptorOwner/Group/Dacl/Sacl

C28637

предупреждение C28637: вызов функции в глобальном инициализаторе небезопасн

C28638

предупреждение C28638: заглушка задержки функции отсутствует соответствующее объявление

C28639

предупреждение C28639: вызов дескриптора закрытия со строкой

C28640

предупреждение C28640: заглушка задержки функции должна быть статической функцией

C28644

предупреждение C28644: возвращаемое значение из DPA_InsertPtr не проверяется

C28645

предупреждение C28645: MessageBox был вызван с помощью символа вопросительного знака, который больше не рекомендуется

C28648

предупреждение C28648: PulseEvent является ненадежной функцией

C28649

предупреждение C28649: автоматические или глобальные массивы стека никогда не имеют значения NULL

C28650

предупреждение C28650: тип, для которого используется !0, не рассматривает его как случай сбоя.

Возвращает значение состояния, например ! Значение TRUE не совпадает с возвратом значения состояния, указывающего на сбой.

C28651

предупреждение C28651: статический инициализатор вызывает копирование на страницах записи из-за указателей функции-члена

C28652

предупреждение C28652: Статический инициализатор вызывает копирование на страницах записи из-за перегрузки побитовых операторов

C28714

предупреждение C28714: приведение между семантически разными целочисленными типами

C28715

предупреждение C28715: приведение между семантически разными целочисленными типами

C28716

предупреждение C28716: приведение между семантически разными целочисленными типами с помощью компилятора

C28717

предупреждение C28717: недопустимый тип VARIANT

C28718

предупреждение C28718: неаннотированный буфер

C28719

предупреждение C28719: запрещенное использование API

C28720

Предупреждение C28720: запрещенное использование API

C28721

Предупреждение C28721: нерекомендуемая архитектура счетчика производительности

C28722

предупреждение C28722: неаннотированный буфер в объявлении функции

C28723

предупреждение C28723: неаннотированный буфер в определении функции без соответствующего объявления

C28725

предупреждение C28725: используйте Watson вместо setUnhandledExceptionFilter

C28726

Предупреждение C28726: запрещенное использование API

C28727

Предупреждение C28727: запрещенное использование API

C28728

предупреждение C28728: запрещенное использование API

C28730

предупреждение C28730: возможное назначение "\0" непосредственно указателю.

C28735

предупреждение C28735: запрещено использование багрового API

C28736

предупреждение C28736: использование запрещенного аргумента API

C28740

предупреждение C28740: буфер без знака без подписи

C28741

предупреждение C28741: неаннотированный буфер в функции

C28742

предупреждение C28742: буфер без аннотации в функции

C28750

предупреждение C28750: запрещено использование lstrlen и его вариантов

C28751

предупреждение C28751: запрещено использование ExAllocatePool и его вариантов

C28752

предупреждение C28752: запрещено использование API kernel32 или advapi32

C28753

предупреждение C28753: использование неопределенного порядка оценки параметров

C30029

предупреждение C30029: вызов функции выделения памяти, которая запрашивает исполняемую память

C30030

предупреждение C30030: вызов функции выделения памяти и передача параметра, указывающего исполняемую память

C30031

предупреждение C30031: вызов функции выделения памяти и передача параметра, указывающего исполняемую память

C30032

предупреждение C30032: вызов функции выделения памяти и принудительное выполнение запроса исполняемой памяти с помощью директивы POOL_NX_OPTOUT

C30033

предупреждение C30033: выделение исполняемого файла обнаружено в драйвере, скомпилированном с POOL_NX_OPTIN. Этот драйвер был определен для загрузки во время выполнения другим драйвером. Убедитесь, что драйвер загрузки вызывает ExInitializeDriverRuntime(DrvRtPoolNxOptIn) в своем DriverEntry.

C30034

предупреждение C30034: передача значения флага функции выделения, которая может привести к выделению исполняемой памяти. Убедитесь, что функция выделения не запрашивает форму исполняемого пула.

C30035

предупреждение C30035: выполнен вызов функции, которая должна быть выполнена из функции инициализации (например, DriverEntry() или DllInitialize()). PREfast не удалось определить, был ли вызов выполнен из функции инициализации.