Vue d'ensemble de l'analyse du code pour les pilotes
Le Kit de pilotes Windows fournit une extension spécifique au pilote de l’outil Analyse du code dans Microsoft Visual Studio. L’analyse du code pour les pilotes inclut des règles qui s’appliquent uniquement aux pilotes, en particulier aux pilotes en mode noyau. L’analyse du code pour les pilotes peut détecter les erreurs potentielles dans votre code dès que le code peut être compilé.
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.
Fonctionnement de l’outil Analyse du code
L’outil Analyse du code intercepte l’appel de l’utilitaire de génération au compilateur standard, Cl.exe et, à la place, exécute un compilateur d’interception CL qui analyse le code source du pilote et crée un fichier journal des messages d’erreur et d’avertissement. Vous pouvez exécuter l’outil Analyse du code lui-même ou configurer l’outil Analyse du code pour qu’il s’exécute lorsque vous générez votre pilote. Lorsque vous exécutez l’outil Analyse du code lui-même (Analyser l’analyse > du code sur la solution), les résultats s’affichent dans la fenêtre Rapport d’analyse du code. Lorsque vous exécutez l’outil Analyse du code dans le cadre de la build, le compilateur d’interception CL crée un fichier journal de messages d’erreur et d’avertissement, puis appelle la version standard de Cl.exe pour produire la sortie de build. Les fichiers d’objets résultants sont identiques à ceux générés par une commande de build standard.
Lorsque le compilateur interceptant s’exécute, l’analyse du code pour les pilotes examine chaque fonction dans le code indépendamment, puis simule l’exécution de tous les chemins possibles via le code, en recherchant des erreurs de pilote courantes et des pratiques de codage sans sens. L’outil Analyse du code s’exécute relativement rapidement, même sur des pilotes plus volumineux, et le rapport qu’il génère identifie précisément la ligne de code du pilote avec l’erreur suspecte.
Les types d’erreurs d’analyse du code peuvent détecter
L’analyse du code peut détecter plusieurs types d’erreurs, y compris les erreurs dans les catégories suivantes :
Mémoire : fuites de mémoire potentielles, pointeurs NULL déréférencements , accès à la mémoire non initialisée, utilisation excessive de la pile en mode noyau et utilisation incorrecte des balises de pool.
Ressources : échec de la mise en production de ressources telles que des verrous, des ressources qui doivent être conservées lors de l’appel de certaines fonctions et des ressources qui ne doivent pas être conservées lors de l’appel d’autres fonctions.
Utilisation de fonction : utilisation potentiellement incorrecte de certaines fonctions, arguments de fonction qui apparaissent incorrects, incompatibilités de type d’argument possibles pour les fonctions qui ne vérifient pas strictement les types, l’utilisation possible de certaines fonctions obsolètes et les appels de fonction à un irQL potentiellement incorrect.
État à virgule flottante : échec de la protection de l’état matériel à virgule flottante dans un pilote et tentative de restauration de l’état à virgule flottante après l’avoir enregistré à un autre IRQL.
Règles de précédence : code qui peut ne pas se comporter comme programmeur prévu en raison des règles de précédence de la programmation C.
Pratiques de codage en mode noyau : pratiques de codage susceptibles d’entraîner des erreurs, telles que la modification d’une structure de liste de descripteurs de mémoire opaque (MDL), l’échec de l’examen de la valeur d’une variable définie par une fonction appelée et l’utilisation de fonctions de manipulation de chaîne C/C++ plutôt que les fonctions de chaîne sécurisées définies dans Ntstrsafe.h.
Pratiques de codage spécifiques au pilote : opérations spécifiques qui sont souvent une source d’erreurs dans les pilotes en mode noyau. Par exemple, la copie d’un paquet de requête d’E/S entier (IRP) sans modifier les membres et enregistrer un pointeur vers une chaîne ou un argument de structure au lieu de copier un argument dans une routine DriverEntry.
Avertissements d’analyse du code
L’outil Analyse du code utilise un modèle basé sur des règles pour identifier les erreurs dans le code du programme ou du pilote. Chaque règle est associée à un avertissement signalé si l’outil Analyse du code détecte une violation de la règle. Pour plus d’informations sur les avertissements spécifiques au pilote, consultez Analyse du code pour les avertissements des pilotes. Pour plus d’informations sur l’ensemble principal d’avertissements que l’outil Analyse du code dans les rapports Visual Studio, consultez Avertissements d’analyse du code.
Annotations
L’une des fonctionnalités importantes que fournit l’outil Analyse du code est la possibilité d’annoter les descriptions de fonctions et d’autres entités dans le code source du pilote. L’outil Analyse du code a une étendue intra-fonctionnelle ; autrement dit, il analyse les interactions entre les fonctions. L’objectif des annotations est de fournir une expression plus complète du contrat entre les fonctions appelées et appelantes, afin que l’outil Analyse du code puisse vérifier que le contrat est respecté. Un autre objectif des annotations est qu’ils informent les personnes qui lisent le code de la façon dont la fonction doit être utilisée et quels résultats peuvent être attendus. Les annotations déclarent le contrat de l’interface et ne tentent pas de décrire la façon dont ce contrat est obtenu. Dans de nombreux cas, les résultats de l’exécution de l’outil Analyse du code reflètent l’absence d’une annotation appropriée et en ajoutant l’annotation, l’avertissement concernant l’annotation manquante est supprimé et des vérifications supplémentaires sont activées. Pour plus d’informations, consultez annotations SAL 2.0 pour les pilotes Windows. Pour plus d’informations sur SAL 2.0, consultez Utilisation d’annotations SAL pour réduire les défauts de code C/C++. SAL 2.0 remplace SAL 1.0. SAL 2.0 doit être utilisé avec wdK pour Windows 8. Si vous avez besoin d’informations sur SAL 1.0 pour les pilotes, reportez-vous à la documentation PREfast for Drivers Annotations fournie avec wdK pour Windows 7.
Interprétation du résultat
L’analyse du code pour les pilotes est facile à exécuter et s’exécute rapidement, même sur des pilotes et des programmes très volumineux. Le travail du développeur consiste à examiner la sortie, à analyser les erreurs détectées par l’outil Analyse du code et à distinguer les erreurs de codage réelles du code valide que l’outil Analyse du code a mal interprété.
Pour obtenir une référence complète qui décrit chaque avertissement que l’outil Analyse du code peut détecter, consultez l’analyse du code pour les avertissements des pilotes. Pour plus d’informations sur l’ensemble principal d’avertissements que l’outil Analyse du code dans les rapports Visual Studio, consultez Avertissements d’analyse du code.
La résolution d’un avertissement d’analyse du code implique généralement de mettre à jour le code source le cas échéant, ou d’ajouter une annotation pour clarifier le contrat de fonction. L’ajout d’une annotation permet à l’analyseur d’appliquer le contrat pour tous les appelants futurs, et il améliore également la lisibilité.
Si les résultats de l’analyse du code affichent des erreurs que vous déterminez, après examen prudent, ne sont pas valides et ne peuvent pas être évités même avec l’utilisation d’annotations, vous pouvez choisir d’exclure ou de supprimer ces avertissements. Pour plus d’informations, consultez Comment exécuter l’analyse du code pour les pilotes.
Rubriques connexes
Comment exécuter l’analyse du code pour les pilotes
Outil Analyse du code dans Visual Studio
Analyse du code pour les avertissements des pilotes