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 |
---|---|
avertissement C28101 : Le module Drivers a déduit que la fonction actuelle n’est pas le type correct de fonction |
|
avertissement C28110 : Les pilotes doivent protéger l’état matériel à virgule flottante. Voir l’utilisation de float |
|
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). |
|
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. |
|
avertissement C28120 : la fonction n’est pas autorisée à être appelée au niveau actuel de l’IRQ. Le niveau actuel est trop faible. |
|
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é. |
|
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. |
|
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. |
|
avertissement C28124 : L’appel au niveau IRQ doit être défini sous le minimum acceptable pour la fonction analysée. |
|
avertissement C28126 : Le paramètre AccessMode pour ObReferenceObject* doit être IRP-RequestorMode> |
|
avertissement C28127 : la fonction utilisée comme routine ne correspond pas exactement au type attendu. |
|
avertissement C28128 : Un accès à un champ a été effectué directement. Il devrait être fait par une routine. |
|
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 |
|
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 |
|
avertissement C28132 : Prise de la taille du pointeur |
|
avertissement C28133 : IoInitializeTimer est mieux appelé à partir d’AddDevice |
|
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 |
|
avertissement C28135 : Si le premier argument de KeWaitForSingleObject est une variable locale, le paramètre Mode doit être KernelMode |
|
avertissement C28139 : L’argument doit correspondre exactement au type |
|
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 |
|
avertissement C28143 : Une routine de répartition qui appelle IoMarkIrpPending doit également retourner STATUS_PENDING |
|
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. |
|
avertissement C28145 : La structure MDL opaque ne doit pas être modifiée par un pilote |
|
avertissement C28146 : Les pilotes en mode noyau doivent utiliser ntstrsafe.h, et non strsafe.h. Trouvé dans le fichier source |
|
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 |
|
avertissement C28150 : La fonction entraîne la définition du niveau IRQ au-dessus du maximum acceptable pour la fonction analysée |
|
avertissement C28151 : La valeur n’est pas une valeur légale pour un IRQL |
|
avertissement C28152 : Retour d’une fonction de type AddDevice de manière inattendue DO_DEVICE_INITIALIZING |
|
avertissement C28153 : Impossible d’évaluer la valeur d’un IRQL à partir de l’annotation dans ce contexte. |
|
avertissement C28156 : Le runtime d’intégration réel est incompatible avec le runtime d’intégration irQL requis |
|
avertissement C28157 : Le runtime d’intégration n’a jamais été restauré |
|
avertissement C28158 : Aucun IRQL n’a été enregistré |
|
avertissement C28161 : Sortie sans acquérir le droit d’utiliser du matériel flottant |
|
avertissement C28162 : Sortie lors de la conservation du droit d’utiliser du matériel à virgule flottante |
|
avertissement C28165 : Le pointeur de fonction de classe ne correspond pas à la classe de fonction |
|
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. |
|
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é. |
|
avertissement C28168 : La fonction dispatch n’a pas d’annotation Dispatch_type correspondant à cette entrée de table de répartition |
|
avertissement C28169 : la fonction dispatch n’a pas d’annotations Dispatch_type |
|
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 |
|
avertissement C28171 : La fonction a plusieurs instances de PAGED_CODE ou de PAGED_CODE_LOCKED |
|
avertissement C28172 : La fonction a PAGED_CODE ou PAGED_CODE_LOCKED, mais n’est pas déclarée dans un segment paginé |
|
avertissement C28173 : La fonction actuelle semble s’adapter de manière incorrecte à la mémoire physique supérieure à 4 Go |
|
avertissement C28175 : Le membre du struct ne doit pas être accessible par un pilote |
|
avertissement C28176 : Le membre du struct ne doit pas être modifié par un pilote |
|
avertissement C28177 : La fonction est annotée avec plusieurs classes de fonction. Tout sauf un sera ignoré. |
|
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 |
|
Une erreur de syntaxe dans les annotations a été trouvée pour la propriété dans la fonction. |
|
avertissement C28268 : La classe de fonction sur la fonction ne correspond pas à la classe de fonction sur le typedef utilisé ici |
|
avertissement C28601 : Éviter le blocage sur HWND_BROADCAST |
|
avertissement C28602 : Éviter d’appeler SendMessageTimeout avec HWND_BROADCAST |
|
avertissement C28604 : Évitez d’appeler SendMessageTimeout avec SMTO_ABORTIFHUNG avec un délai d’expiration de 0 |
|
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() |
|
avertissement C28616 : condition AV multithread |
|
avertissement C28617 : Évitez d’utiliser la valeur de retour de _beginthread(). Utilisez _beginthreadex() à la place |
|
avertissement C28623 : Cast non signé des coordonnées GetMessagePos(). Utiliser GET_X_LPARAM/GET_Y_LPARAM au lieu de LOWORD/HIWORD |
|
avertissement C28624 : Aucun appel à Release() pour faire correspondre le refcount incrémenté de LResultFromObject |
|
avertissement C28625 : L’appel de fonction utilisé pour effacer les données sensibles sera optimisé |
|
avertissement C28636 : Appel de LocalFree sur un pointeur non alloué obtenu à partir d’appels à GetSecurityDescriptorOwner/Group/Dacl/Sacl |
|
avertissement C28637 : L’appel de la fonction dans un initialiseur global est dangereux |
|
avertissement C28638 : le stub de chargement de retard de fonction est manquant dans une déclaration correspondante |
|
avertissement C28639 : Appel d’un handle de fermeture avec chaîne |
|
avertissement C28640 : le stub de délai de chargement de fonction doit être une fonction statique |
|
avertissement C28644 : Valeur de retour de DPA_InsertPtr non cochée |
|
avertissement C28645 : MessageBox a été appelé à l’aide du symbole de message de point d’interrogation qui n’est plus recommandé |
|
avertissement C28648 : PulseEvent est une fonction non fiable |
|
avertissement C28649 : les tableaux de piles automatiques ou globales ne sont jamais NULL |
|
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. |
|
avertissement C28651 : l’initialiseur statique provoque la copie sur des pages d’écriture en raison de pointeurs de fonction membre |
|
avertissement C28652 : L’initialiseur statique provoque la copie sur les pages d’écriture en raison d’opérateurs de bits surchargés |
|
avertissement C28714 : Effectuer un cast entre des types entiers sémantiquement différents |
|
avertissement C28715 : Effectuer un cast entre des types entiers sémantiquement différents |
|
avertissement C28716 : Conversion insérée par le compilateur entre différents types intégraux sémantiquement différents |
|
avertissement C28717 : Type VARIANT non valide |
|
avertissement C28718 : Mémoire tampon non annotée |
|
avertissement C28719 : Utilisation de l’API interdite |
|
avertissement C28720 : Utilisation de l’API interdite |
|
avertissement C28721 : Architecture du compteur de performances déconseillée |
|
avertissement C28722 : Mémoire tampon non annotée dans la déclaration de fonction |
|
avertissement C28723 : Mémoire tampon non annotée dans la définition de fonction qui n’a aucune déclaration correspondante |
|
avertissement C28725 : Utilisez Watson au lieu de ce SetUnhandledExceptionFilter |
|
avertissement C28726 : Utilisation de l’API interdite |
|
avertissement C28727 : Utilisation de l’API interdite |
|
avertissement C28728 : Utilisation de l’API interdite |
|
avertissement C28730 : Affectation possible de « \0 » directement à un pointeur. |
|
avertissement C28735 : Utilisation de l’API Crimson interdite |
|
avertissement C28736 : Utilisation de l’argument d’API interdit |
|
avertissement C28740 : Mémoire tampon non signée non signée |
|
avertissement C28741 : Mémoire tampon non annotée dans la fonction |
|
avertissement C28742 : Mémoire tampon non annotée dans la fonction |
|
avertissement C28750 : Utilisation interdite de lstrlen et ses variantes |
|
avertissement C28751 : Utilisation interdite d’ExAllocatePool et de ses variantes |
|
avertissement C28752 : Utilisation interdite du noyau32 ou de l’API advapi32 |
|
avertissement C28753 : S’appuyer sur l’ordre non défini d’évaluation des paramètres |
|
avertissement C30029 : Appel d’une fonction d’allocation de mémoire qui demande la mémoire exécutable |
|
avertissement C30030 : Appel d’une fonction d’allocation de mémoire et passage d’un paramètre qui indique la mémoire exécutable |
|
avertissement C30031 : Appel d’une fonction d’allocation de mémoire et passage d’un paramètre qui indique la mémoire exécutable |
|
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 |
|
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. |
|
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. |
|
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. |