Outils de vérification statique et dynamique
Il existe deux types de base d’outils de vérification :
Les outils de vérification statique examinent le code du pilote sans exécuter le pilote. Étant donné que ces outils ne s’appuient pas sur des tests qui exercicent le code, ils peuvent être extrêmement approfondis. Théoriquement, les outils de vérification statique peuvent examiner tout le code du pilote, y compris les chemins de code rarement exécutés en pratique. Toutefois, étant donné que le pilote n’est pas en cours d’exécution, il peut générer des résultats faux positifs. Autrement dit, ils peuvent signaler une erreur dans un chemin de code qui peut ne pas se produire dans la pratique.
Les outils de vérification dynamique examinent le code du pilote pendant l’exécution du pilote, généralement en interceptant les appels aux routines de prise en charge courantes du pilote et en remplaçant les appels par leurs propres versions de vérification des erreurs des mêmes routines. Étant donné que le pilote est en cours d’exécution pendant que les outils dynamiques effectuent la vérification, les résultats faux positifs sont rares. Toutefois, étant donné que les outils dynamiques détectent uniquement les actions qui se produisent pendant qu’ils surveillent le pilote, les outils peuvent manquer certains défauts du pilote si la couverture des tests de pilotes n’est pas adéquate. En même temps, en utilisant des informations disponibles au moment de l’exécution, par exemple des informations plus difficiles à extraire statiquement à partir du code source, les outils de vérification dynamique peuvent détecter certaines classes d’erreurs de pilote plus difficiles à détecter avec des outils d’analyse statique.
La meilleure pratique consiste à utiliser une combinaison d’outils de vérification statique et dynamique. Les outils statiques vous permettent de vérifier les chemins de code difficiles à exercer dans la pratique, tandis que les outils dynamiques trouvent des erreurs graves qui se produisent dans le pilote.
Important
Le Programme de compatibilité matérielle Windows nécessite codeQL pour les tests STL (Static Tool Logo) sur nos systèmes d’exploitation client et serveur. Nous continuerons à maintenir la prise en charge de SDV et de l’autorité de certification sur les produits plus anciens. Les partenaires sont vivement encouragés à passer en revue les exigences CodeQL pour le test STL (Static Tool Logo). Pour plus d’informations sur l’utilisation de CodeQL, consultez CodeQL et le test du logo Static Tools.
Enquête sur les outils de vérification
Les outils de vérification suivants sont décrits dans le kit WDK et recommandés pour une utilisation par les développeurs de pilotes et les testeurs. Ils sont répertoriés dans l’ordre dans lequel ils sont généralement utilisés.
Dès que le code se compile
- CodeQL, de GitHub, est un puissant moteur d’analyse sémantique de code, et la combinaison d’une suite étendue de requêtes de sécurité à forte valeur ajoutée ainsi qu’une plateforme robuste en font un outil précieux pour sécuriser le code des pilotes. Pour plus d’informations, consultez CodeQL et le test du logo Static Tools.
Outils statiques supplémentaires
Selon la version de Windows à partir de laquelle vous créez un pilote, d’autres outils statiques peuvent être nécessaires.
L’analyse du code pour pilotes est un outil de vérification statique qui s’exécute au moment de la compilation. L’analyse du code pour les pilotes peut vérifier les pilotes écrits en C/C++ et le code managé. Il examine le code dans chaque fonction d’un pilote indépendamment, de sorte que vous pouvez l’exécuter dès que vous pouvez générer votre pilote. Il s’exécute relativement rapidement et utilise peu de ressources.
Les fonctionnalités de base de l’outil Analyse du code dans Visual Studio détectent des erreurs de codage générales, telles que la vérification des valeurs de retour. Les fonctionnalités spécifiques au pilote détectent des erreurs de codage de pilotes plus subtiles, telles que la sortie de champs non initialisés dans un IRP copié et l’échec de la restauration d’un IRQL modifié à la fin d’une routine.
Static Driver Verifier (SDV) est un outil de vérification statique qui s’exécute au moment de la compilation et vérifie le code du pilote en mode noyau écrit en C/C++. Il est inclus dans wdK et peut être démarré à partir de Visual Studio Ultimate 2012 ou à partir d’une fenêtre d’invite de commandes Visual Studio à l’aide de MSBuild.
En fonction d’un ensemble de règles d’interface et d’un modèle du système d’exploitation, static Driver Verifier détermine si le pilote interagit correctement avec le noyau du système d’exploitation Windows. Static Driver Verifier est extrêmement complet : il explore tous les chemins accessibles dans le code source du pilote et les exécute symboliquement. Par conséquent, il trouve des bogues qui ne sont pas détectés à l’aide d’une autre méthode conventionnelle de test de pilote.
Important
SDV n’est plus pris en charge et SDV n’est plus disponible dans les versions wdK ou EWDK de Windows 24H2. Il n’est pas disponible dans les kits WDK plus récents que la build 26017 et n’est pas inclus dans windows 24H2 RTM WDK.
SDV peut toujours être utilisé en téléchargeant windows 11, version 22H2 EWDK (publiée le 24 octobre 2023) avec Visual Studio Build Tools 17.1.5 à partir du téléchargement du Kit de pilotes Windows (WDK). Seule l’utilisation du kit WDK Entreprise pour exécuter SDV est recommandée. L’utilisation de versions antérieures de WDK standard conjointement avec les versions récentes de Visual Studio n’est pas recommandée, car cela entraînera probablement des échecs d’analyse.
À 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.
Quand le pilote s’exécute
Utilisez les outils de vérification dynamique suivants dès que le pilote est généré et s’exécute sans erreurs évidentes.
Le vérificateur de pilotes est un outil de vérification dynamique écrit en particulier pour les pilotes Windows. Il inclut plusieurs tests qui peuvent être exécutés simultanément sur plusieurs pilotes. Le vérificateur de pilotes est si efficace pour trouver des bogues sérieux dans les pilotes que les développeurs de pilotes expérimentés et les testeurs configurent Driver Verifier pour s’exécuter chaque fois que leur pilote s’exécute dans un environnement de développement ou de test. Driver Verifier est inclus dans Windows. Lorsque vous activez le vérificateur de pilotes pour un pilote, vous devez également exécuter plusieurs tests sur le pilote. Le vérificateur de pilotes peut détecter certains bogues de pilotes difficiles à détecter à l’aide d’outils de vérification statiques seuls. Voici quelques exemples de ces types de bogues :
Dépassements de mémoire tampon du pool de noyau. Lorsque le pilote vérifié alloue des mémoires tampons de pool, le vérificateur de pilotes les protège avec une page de mémoire non accessible. Si le pilote tente d’utiliser la mémoire après la fin de la mémoire tampon, le vérificateur de pilotes émet une vérification de bogue.
Utilisation de la mémoire après l’avoir libérée. Les blocs de mémoire de pool spéciaux utilisent leur propre page de mémoire et ne partagent pas de pages de mémoire avec d’autres allocations. Lorsque le pilote libère le bloc de mémoire du pool, la page de mémoire correspondante devient non accessible. Si le pilote tente d’utiliser cette mémoire après l’avoir libérée, le pilote se bloque instantanément.
Utilisation de la mémoire paginable lors de l’exécution à l’irQL avec élévation de privilèges. Lorsqu’un pilote vérifié déclenche l’IRQL à DISPATCH_LEVEL ou une version ultérieure, le vérificateur de pilotes supprime toutes les mémoires paginables du jeu de travail système, simulant un système sous pression mémoire. Le pilote se bloque s’il tente d’utiliser l’une de ces adresses virtuelles paginables.
Simulation de ressources faibles. Pour simuler un système dans des conditions de ressources faibles, le vérificateur de pilotes peut échouer à diverses API du noyau du système d’exploitation appelées par les pilotes.
Fuites de mémoire. Le vérificateur de pilotes effectue le suivi des allocations de mémoire effectuées par un pilote et vérifie que la mémoire est libérée avant le déchargement du pilote.
Les opérations d’E/S qui prennent trop de temps pour se terminer ou pour être annulées. Le vérificateur de pilotes peut tester la logique du pilote pour répondre à STATUS_PENDING valeurs de retour à partir d’IoCallDriver.
Vérification de conformité DDI. (Disponible à partir de Windows 8) Le vérificateur de pilotes applique un ensemble de règles DDI (Device Driver Interface) qui vérifient l’interaction appropriée entre un pilote et l’interface du noyau du système d’exploitation. Ces règles correspondent aux règles que static Driver Verifier utilise pour analyser le code source du pilote. Si le vérificateur de pilotes détecte une erreur lorsque la vérification de conformité DDI est activée, exécutez Static Driver Verifier et sélectionnez la même règle qui a provoqué l’erreur. Static Driver Verifier peut vous aider à localiser la cause du défaut dans le code source du pilote.
L’assainisseur d’adresses du noyau (KASAN) est une technologie de détection de bogues prise en charge sur les pilotes Windows qui vous permet de détecter plusieurs classes d’accès à la mémoire illégale, telles que les dépassements de mémoire tampon et les événements d’utilisation après libération.
Application Verificationr est un outil de vérification dynamique pour les applications en mode utilisateur et les pilotes écrits en C/C++. Il ne vérifie pas le code managé.