Partager via


Analyse du code pour les avertissements des pilotes

Cette section répertorie et décrit les avertissements signalés par l’analyse du code pour les pilotes lorsqu’il détecte une erreur possible dans le code du pilote. Notez que certains avertissements sont destinés au code en mode noyau et peuvent être ignorés lors de l’analyse des pilotes en mode utilisateur.

Important

L’analyse du code pour les pilotes est disponible dans windows 24H2 WDK et EWDK, mais il est conseillé qu’il soit mis hors service à une date ultérieure.
À l’avenir, CodeQL sera l’outil d’analyse statique principal pour les pilotes. CodeQL fournit un langage de requête puissant qui traite le code comme une base de données à interroger, ce qui facilite l’écriture de requêtes pour des comportements, des modèles spécifiques, etc. Pour plus d’informations sur l’utilisation de CodeQL, consultez CodeQL et le test du logo Static Tools.

L’analyse du code pour les pilotes signale les types d’avertissements suivants :

  • Avertissements généraux (6000-6999) : erreurs potentielles dans la syntaxe C et C++ et la pratique de codage général. Pour obtenir une description de ces avertissements, consultez Analyse du code pour les avertissements C/C++.

  • Avertissements spécifiques windows (28600-28799) : ces avertissements sont spécifiques à certains modèles d’utilisation dans Windows, mais ne sont pas spécifiques aux pilotes.

  • Avertissements spécifiques au pilote (28100-28199) : erreurs dans l’interaction d’un pilote avec l’application, avec d’autres pilotes et avec le système d’exploitation.

  • Erreurs d’annotation (28200-28299 et 36000-36999) : ces avertissements indiquent qu’une annotation a été correctement codée ou utilisée dans un contexte incorrect. Dans la plupart des cas, la présence d’un tel avertissement indique que l’annotation n’a pas l’effet souhaité (ou aucun).

  • Avertissements d’allocation de mémoire (30029-30035) : il s’agit d’avertissements d’allocation de mémoire.

Dans cette section

Sujet Description

C28101

avertissement C28101 : Le module Drivers a déduit que la fonction actuelle n’est pas le type correct de fonction

C28110

avertissement C28110 : Les pilotes doivent protéger l’état matériel à virgule flottante. Voir l’utilisation de float

C28111

avertissement C28111 : irQL où l’état à virgule flottante a été enregistré ne correspond pas au runtime d’intégration actuel (pour cette opération de restauration).

C28114

avertissement : C28114 : la copie d’une entrée de pile IRP entière laisse certains champs initialisés qui doivent être effacés ou mis à jour.

C28120

avertissement C28120 : la fonction n’est pas autorisée à être appelée au niveau actuel de l’IRQ. Le niveau actuel est trop faible.

C28121

avertissement C28121 : La fonction n’est pas autorisée à être appelée au niveau actuel de la fonction IRQ. Le niveau actuel est trop élevé.

C28122

avertissement C28122 : La fonction n’est pas autorisée à être appelée à un niveau IRQ faible. Les appels de fonction antérieurs sont incohérents avec cette contrainte.

C28123

avertissement C28123 : La fonction n’est pas autorisée à être appelée à un niveau IRQ élevé. Les appels de fonction antérieurs sont incohérents avec cette contrainte.

C28124

avertissement C28124 : L’appel au niveau IRQ doit être défini sous le minimum acceptable pour la fonction analysée.

C28126

avertissement C28126 : Le paramètre AccessMode pour ObReferenceObject* doit être IRP-RequestorMode>

C28127

avertissement C28127 : la fonction utilisée comme routine ne correspond pas exactement au type attendu.

C28128

avertissement C28128 : Un accès à un champ a été effectué directement. Il devrait être fait par une routine.

C28129

avertissement C28129 : Une affectation a été faite à un opérande, qui ne doit être modifié qu’à l’aide de jeux de bits et d’effacements

C28131

avertissement C28131 : La routine DriverEntry doit enregistrer une copie de l’argument, et non le pointeur, car le Gestionnaire d’E/S libère la mémoire tampon

C28132

avertissement C28132 : Prise de la taille du pointeur

C28133

avertissement C28133 : IoInitializeTimer est mieux appelé à partir d’AddDevice

C28134

avertissement C28134 : Le type d’une balise de pool doit être intégral, et non pas une chaîne ou un pointeur de chaîne

C28135

avertissement C28135 : Si le premier argument de KeWaitForSingleObject est une variable locale, le paramètre Mode doit être KernelMode

C28139

avertissement C28139 : L’argument doit correspondre exactement au type

C28141

avertissement C28141 : L’argument entraîne la définition du niveau IRQ sous le runtime d’intégration automatique actuel, et cette fonction ne peut pas être utilisée à cet effet

C28143

avertissement C28143 : Une routine de répartition qui appelle IoMarkIrpPending doit également retourner STATUS_PENDING

C28144

avertissement C28144 : À l’intérieur d’une routine d’annulation, au moment de la sortie, le runtime d’intégration dans Irp-CancelIrql> doit être le runtime d’intégration actuel.

C28145

avertissement C28145 : La structure MDL opaque ne doit pas être modifiée par un pilote

C28146

avertissement C28146 : Les pilotes en mode noyau doivent utiliser ntstrsafe.h, et non strsafe.h. Trouvé dans le fichier source

C28147

avertissement C28147 : L’utilisation d’une balise de pool par défaut (' kdD' ou ' mdW') pour les appels à cette fonction défait l’objectif du balisage de pool

C28150

avertissement C28150 : La fonction entraîne la définition du niveau IRQ au-dessus du maximum acceptable pour la fonction analysée

C28151

avertissement C28151 : La valeur n’est pas une valeur légale pour un IRQL

C28152

avertissement C28152 : Retour d’une fonction de type AddDevice de manière inattendue DO_DEVICE_INITIALIZING

C28153

avertissement C28153 : Impossible d’évaluer la valeur d’un IRQL à partir de l’annotation dans ce contexte.

C28156

avertissement C28156 : Le runtime d’intégration réel est incompatible avec le runtime d’intégration irQL requis

C28157

avertissement C28157 : Le runtime d’intégration n’a jamais été restauré

C28158

avertissement C28158 : Aucun IRQL n’a été enregistré

C28161

avertissement C28161 : Sortie sans acquérir le droit d’utiliser du matériel flottant

C28162

avertissement C28162 : Sortie lors de la conservation du droit d’utiliser du matériel à virgule flottante

C28165

avertissement C28165 : Le pointeur de fonction de classe ne correspond pas à la classe de fonction

C28166

avertissement C28166 : La fonction ne restaure pas le runtime d’intégration sur la valeur qui était en cours à l’entrée de fonction et doit le faire.

C28167

avertissement C28167 : La fonction modifie le RUNTIME d’intégration et ne restaure pas le runtime d’intégration avant de quitter. Il doit être annoté pour refléter la modification ou le runtime d’intégration doit être restauré.

C28168

avertissement C28168 : La fonction dispatch n’a pas d’annotation Dispatch_type correspondant à cette entrée de table de répartition

C28169

avertissement C28169 : la fonction dispatch n’a pas d’annotations Dispatch_type

C28170

avertissement C28170 : La fonction a été déclarée dans un segment paginé, mais aucune PAGED_CODE ni PAGED_CODE_LOCKED n’a été trouvée

C28171

avertissement C28171 : La fonction a plusieurs instances de PAGED_CODE ou de PAGED_CODE_LOCKED

C28172

avertissement C28172 : La fonction a PAGED_CODE ou PAGED_CODE_LOCKED, mais n’est pas déclarée dans un segment paginé

C28173

avertissement C28173 : La fonction actuelle semble s’adapter de manière incorrecte à la mémoire physique supérieure à 4 Go

C28175

avertissement C28175 : Le membre du struct ne doit pas être accessible par un pilote

C28176

avertissement C28176 : Le membre du struct ne doit pas être modifié par un pilote

C28177

avertissement C28177 : La fonction est annotée avec plusieurs classes de fonction. Tout sauf un sera ignoré.

C28260

avertissement C28260 : Une erreur de syntaxe dans les annotations a été trouvée lors de l’analyse d’une propriété à l’intérieur d’une fonction

C28266

Une erreur de syntaxe dans les annotations a été trouvée pour la propriété dans la fonction.

C28268

avertissement C28268 : La classe de fonction sur la fonction ne correspond pas à la classe de fonction sur le typedef utilisé ici

C28601

avertissement C28601 : Éviter le blocage sur HWND_BROADCAST

C28602

avertissement C28602 : Éviter d’appeler SendMessageTimeout avec HWND_BROADCAST

C28604

avertissement C28604 : Évitez d’appeler SendMessageTimeout avec SMTO_ABORTIFHUNG avec un délai d’expiration de 0

C28615

avertissement C28615 : Doit appeler _resetstkoflw dans le bloc __except() lors de l’appel de _alloca dans le bloc __try. N’appelez pas _resetstkoflw à partir d’un bloc catch()

C28616

avertissement C28616 : condition AV multithread

C28617

avertissement C28617 : Évitez d’utiliser la valeur de retour de _beginthread(). Utilisez _beginthreadex() à la place

C28623

avertissement C28623 : Cast non signé des coordonnées GetMessagePos(). Utiliser GET_X_LPARAM/GET_Y_LPARAM au lieu de LOWORD/HIWORD

C28624

avertissement C28624 : Aucun appel à Release() pour faire correspondre le refcount incrémenté de LResultFromObject

C28625

avertissement C28625 : L’appel de fonction utilisé pour effacer les données sensibles sera optimisé

C28636

avertissement C28636 : Appel de LocalFree sur un pointeur non alloué obtenu à partir d’appels à GetSecurityDescriptorOwner/Group/Dacl/Sacl

C28637

avertissement C28637 : L’appel de la fonction dans un initialiseur global est dangereux

C28638

avertissement C28638 : le stub de chargement de retard de fonction est manquant dans une déclaration correspondante

C28639

avertissement C28639 : Appel d’un handle de fermeture avec chaîne

C28640

avertissement C28640 : le stub de délai de chargement de fonction doit être une fonction statique

C28644

avertissement C28644 : Valeur de retour de DPA_InsertPtr non cochée

C28645

avertissement C28645 : MessageBox a été appelé à l’aide du symbole de message de point d’interrogation qui n’est plus recommandé

C28648

avertissement C28648 : PulseEvent est une fonction non fiable

C28649

avertissement C28649 : les tableaux de piles automatiques ou globales ne sont jamais NULL

C28650

avertissement C28650 : le type pour lequel !0 est utilisé ne le traite pas comme cas d’échec.

Retour d’une valeur d’état telle que ! TRUE n’est pas identique au renvoi d’une valeur d’état qui indique un échec.

C28651

avertissement C28651 : l’initialiseur statique provoque la copie sur des pages d’écriture en raison de pointeurs de fonction membre

C28652

avertissement C28652 : L’initialiseur statique provoque la copie sur les pages d’écriture en raison d’opérateurs de bits surchargés

C28714

avertissement C28714 : Effectuer un cast entre des types entiers sémantiquement différents

C28715

avertissement C28715 : Effectuer un cast entre des types entiers sémantiquement différents

C28716

avertissement C28716 : Conversion insérée par le compilateur entre différents types intégraux sémantiquement différents

C28717

avertissement C28717 : Type VARIANT non valide

C28718

avertissement C28718 : Mémoire tampon non annotée

C28719

avertissement C28719 : Utilisation de l’API interdite

C28720

avertissement C28720 : Utilisation de l’API interdite

C28721

avertissement C28721 : Architecture du compteur de performances déconseillée

C28722

avertissement C28722 : Mémoire tampon non annotée dans la déclaration de fonction

C28723

avertissement C28723 : Mémoire tampon non annotée dans la définition de fonction qui n’a aucune déclaration correspondante

C28725

avertissement C28725 : Utilisez Watson au lieu de ce SetUnhandledExceptionFilter

C28726

avertissement C28726 : Utilisation de l’API interdite

C28727

avertissement C28727 : Utilisation de l’API interdite

C28728

avertissement C28728 : Utilisation de l’API interdite

C28730

avertissement C28730 : Affectation possible de « \0 » directement à un pointeur.

C28735

avertissement C28735 : Utilisation de l’API Crimson interdite

C28736

avertissement C28736 : Utilisation de l’argument d’API interdit

C28740

avertissement C28740 : Mémoire tampon non signée non signée

C28741

avertissement C28741 : Mémoire tampon non annotée dans la fonction

C28742

avertissement C28742 : Mémoire tampon non annotée dans la fonction

C28750

avertissement C28750 : Utilisation interdite de lstrlen et ses variantes

C28751

avertissement C28751 : Utilisation interdite d’ExAllocatePool et de ses variantes

C28752

avertissement C28752 : Utilisation interdite du noyau32 ou de l’API advapi32

C28753

avertissement C28753 : S’appuyer sur l’ordre non défini d’évaluation des paramètres

C30029

avertissement C30029 : Appel d’une fonction d’allocation de mémoire qui demande la mémoire exécutable

C30030

avertissement C30030 : Appel d’une fonction d’allocation de mémoire et passage d’un paramètre qui indique la mémoire exécutable

C30031

avertissement C30031 : Appel d’une fonction d’allocation de mémoire et passage d’un paramètre qui indique la mémoire exécutable

C30032

avertissement C30032 : Appel d’une fonction d’allocation de mémoire et forcer la demande de mémoire exécutable à l’aide de la directive POOL_NX_OPTOUT

C30033

avertissement C30033 : l’allocation exécutable a été détectée dans un pilote compilé avec POOL_NX_OPTIN. Ce pilote a été déterminé à être chargé au moment de l’exécution par un autre pilote. Vérifiez que le pilote de chargement appelle ExInitializeDriverRuntime(DrvRtPoolNxOptIn) dans son DriverEntry.

C30034

avertissement C30034 : Passage d’une valeur d’indicateur à une fonction d’allocation pouvant entraîner l’allocation de mémoire exécutable. Vérifiez que la fonction d’allocation ne demande pas une forme de pool non paginé exécutable.

C30035

avertissement C30035 : un appel a été effectué à une fonction qui doit être effectuée à partir de l’intérieur de la fonction d’initialisation (par exemple, DriverEntry() ou DllInitialize()). PREfast n’a pas pu déterminer si l’appel a été effectué à partir de la fonction d’initialisation.