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é.

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 exécute à la place un compilateur d’interception CL qui analyse le code source du pilote et crée un fichier journal contenant des messages d’erreur et d’avertissement. Vous pouvez exécuter l’outil Analyse du code seul 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 seul (Analyser exécuter > 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’intercept CL crée un fichier journal contenant des messages d’erreur et d’avertissement, puis il appelle la version standard de Cl.exe pour produire la sortie de build. Les fichiers objet résultants sont les mêmes que 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 du code indépendamment, puis simule l’exécution de tous les chemins d’accès possibles à travers le code, à la recherche d’erreurs de pilote courantes et de pratiques de codage imprudentes. 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 suspectée.

Les types d’erreurs que l’analyse du code peut 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érencés, 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 publication de ressources telles que les verrous, les ressources qui doivent être conservées lors de l’appel de certaines fonctions et les ressources qui ne doivent pas être conservées lors de l’appel d’autres fonctions.

  • Utilisation de la fonction : Utilisation potentiellement incorrecte de certaines fonctions, arguments de fonction qui semblent incorrects, incompatibilités possibles de type d’argument pour des fonctions qui ne case activée pas strictement des types, utilisation possible de certaines fonctions obsolètes et 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é dans un autre IRQL.

  • Règles de priorité : Code qui peut ne pas se comporter comme l’intention du programmeur en raison des règles de précédence de la programmation C.

  • Pratiques de codage en mode noyau : Les pratiques de codage qui peuvent provoquer des erreurs, telles que la modification d’une structure mdl (descripteur de mémoire opaque), l’échec de l’examen de la valeur d’une variable définie par une fonction appelée et l’utilisation des fonctions de manipulation de chaîne C/C++ au lieu des fonctions de chaîne sécurisée définies dans Ntstrsafe.h.

  • Pratiques de codage spécifiques aux pilotes : Opérations spécifiques qui sont souvent une source d’erreurs dans les pilotes en mode noyau. Par exemple, copie d’un paquet de demandes d’E/S (IRP) entier sans modifier les membres et enregistrer un pointeur vers un argument de chaîne ou de structure au lieu de copier un argument dans une routine DriverEntry .

Avertissements relatifs à l’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 qui est signalé si l’outil Analyse du code détecte une violation de la règle. Pour plus d’informations sur les avertissements spécifiques aux pilotes, 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 Visual Studio signale, consultez Avertissements d’analyse du code.

Annotations

L’une des fonctionnalités importantes offertes par l’outil Analyse du code est la possibilité d’annoter des descriptions de fonction et d’autres entités dans le code source du pilote. L’outil Analyse du code a une portée 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 case activée que le contrat est rempli. Un autre objectif des annotations est qu’elles informent quiconque lit 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 atteint. Dans de nombreux cas, les résultats de l’exécution de l’outil Analyse du code reflètent l’absence d’annotation appropriée et, en ajoutant l’annotation, l’avertissement relatif à 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 des 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 le 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 le 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 Analyse du code pour les pilotes Avertissements. Pour plus d’informations sur l’ensemble principal d’avertissements que l’outil Analyse du code dans Visual Studio signale, consultez Avertissements d’analyse du code.

La résolution d’un avertissement d’analyse du code implique généralement soit la mise à jour du code source le cas échéant, soit l’ajout d’une annotation pour clarifier le contrat de fonction. L’ajout d’une annotation permet à l’analyseur d’appliquer le contrat pour tous les futurs appelants et améliore également la lisibilité.

Si les résultats de l’analyse du code indiquent que les erreurs que vous déterminez, après un examen minutieux, ne sont pas valides et ne peuvent pas être évitées 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.

Comment exécuter l’analyse du code pour les pilotes

Outil Analyse du code dans Visual Studio

Avertissements de l'analyse du code pour les pilotes

Avertissements relatifs à l’analyse du code

Annotations SAL 2.0 pour les pilotes Windows