Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A Windows Driver Kit egy illesztőprogram-specifikus bővítményt biztosít a Microsoft Visual Studióban található Kódelemzési eszközhöz . Az illesztőprogramok kódelemzése olyan szabályokat tartalmaz, amelyek csak az illesztőprogramokra vonatkoznak, különösen a kernel módú illesztőprogramokra. Az illesztőprogramok kódelemzése képes észlelni a kód esetleges hibáit, amint a kód lefordítható.
Fontos
Az illesztőprogramok kódelemzése a Windows 24H2 WDK-ban és az EWDK-ban érhető el, de felhívjuk a figyelmét, hogy ezt a jövőben megszüntetik.
A továbbiakban a CodeQL lesz az illesztőprogramok elsődleges statikus elemző eszköze. A CodeQL hatékony lekérdezési nyelvet biztosít, amely a kódot adatbázisként kezeli lekérdezni, így egyszerűen írhat lekérdezéseket adott viselkedések, minták és egyebek céljából.
További információ a CodeQL használatáról a következőben található: CodeQL és a Static Tools Logo Test.
A Kódelemzési eszköz működése
A Kódelemzési eszköz elfogja a build segédprogram hívását a standard fordítóhoz, Cl.exe, és ehelyett futtat egy CL-elfogási fordítót, amely elemzi az illesztőprogram forráskódját, és létrehoz egy hiba- és figyelmeztető üzenetekből álló naplófájlt. A kódelemzési eszközt önállóan is futtathatja, vagy konfigurálhatja a Kódelemzés eszközt úgy, hogy az illesztőprogram létrehozásakor fusson. Ha önállóan futtatja a Kódelemzési eszközt (a kódelemzés elemzése > a megoldáson) az eredmények megjelennek a Kódelemzési jelentés ablakban. Amikor a build részeként futtatja a Kódelemzés eszközt, a CL intercept fordító létrehoz egy hiba- és figyelmeztető üzenetekből álló naplófájlt, majd meghívja a Cl.exe szabványos verzióját a build kimenetének létrehozásához. Az eredményként kapott objektumfájlok megegyeznek a szabványos buildelési parancsok által létrehozott fájlokkal.
Az elfogó fordító futtatásakor az Illesztőprogramok kódelemzése egymástól függetlenül megvizsgálja a kód egyes függvényeit, majd szimulálja a kódon keresztüli összes lehetséges elérési út végrehajtását, gyakori illesztőprogram-hibákat és nem megfelelő kódolási eljárásokat keresve. A Kódelemzési eszköz viszonylag gyorsan fut, még nagyobb illesztőprogramokon is, és az általa létrehozott jelentés pontosan azonosítja az illesztőprogram kódsorát a feltételezett hibával.
A kódelemzés által észlelt hibák típusai
A kódelemzés számos típusú hibát képes észlelni, beleértve a következő kategóriákban előforduló hibákat is:
Memória: Lehetséges memóriaszivárgások, dereferált NULL-mutatók, nem inicializált memória elérése, a kernel módú verem túlzott használata és a memóriakészlet címkék helytelen használata.
Erőforrások: Nem sikerült felszabadítani az erőforrásokat, például a zárolásokat, az egyes függvények meghívásakor tartandó erőforrásokat, valamint azokat az erőforrásokat, amelyeket más függvények hívása során nem szabad tartani.
Függvény használata: Bizonyos függvények lehetséges helytelen használata, helytelennek tűnő függvényargumentumok, lehetséges argumentumtípus-eltérések olyan függvények esetében, amelyek nem ellenőrzik szigorúan a típusokat, bizonyos elavult függvények lehetséges használatát, valamint a függvényhívásokat egy potenciálisan helytelen IRQL-en.
Lebegőpontos állapot: Nem sikerült megvédeni a lebegőpontos hardverállapotot egy illesztőprogramban, és megkísérli visszaállítani a lebegőpontos állapotot, miután egy másik IRQL-be mentette.
Elsőbbségi szabályok: Olyan kód, amely nem úgy viselkedik, mint a programozó a C programozás elsőbbséget élvező szabályai miatt.
Kernel módú kódolási eljárások: Olyan kódolási eljárások, amelyek hibákat okozhatnak, például egy átlátszatlan memórialeírólista-struktúra (MDL) módosítása, egy úgynevezett függvény által beállított változó értékének vizsgálata, valamint az Ntstrsafe.h-ban definiált biztonságos sztringfüggvények helyett a C/C++ sztringmanipulációs függvények használata.
Illesztőprogram-specifikus kódolási eljárások: Bizonyos műveletek, amelyek gyakran hibaforrást jelentenek a kernel módú illesztőprogramokban. Például egy teljes I/O-kéréscsomag (IRP) másolása a tagok módosítása nélkül, és a DriverEntry rutinban lévő argumentum másolása helyett egy mutatót ment egy sztring- vagy struktúraargumentumra.
Kódelemzési figyelmeztetések
A Kódelemzési eszköz egy szabályalapú modellt használ a program vagy az illesztőprogram kódjának hibáinak azonosítására. Minden szabály egy figyelmeztetéshez van társítva, amely akkor lesz jelentve, ha a Kódelemzési eszköz észleli a szabály megsértését. Az illesztőprogram-specifikus figyelmeztetésekkel kapcsolatos részletes információkért tekintse meg az illesztőprogramokra vonatkozó figyelmeztetések kódelemzését. A Visual Studio kódelemzési eszközével kapcsolatos alapvető figyelmeztetésekkel kapcsolatos információkért tekintse meg a Kódelemzési figyelmeztetések című témakört.
Széljegyzetek
A Kódelemzési eszköz egyik fontos képessége a függvényleírások és az illesztőprogram forráskódjában található egyéb entitások megjegyzésekkel való ellátása. A kódelemzési eszköz funkcionális hatókörrel rendelkezik; vagyis elemzi a függvények közötti interakciókat. A széljegyzetek célja, hogy teljesebb kifejezést adjanak a hívott és a hívó függvények közötti szerződésről, hogy a Kódelemzési eszköz ellenőrizze, hogy teljesül-e a szerződés. A széljegyzetek másik célja, hogy tájékoztassák a kódot olvasót a függvény használatáról és az várható eredményekről. A széljegyzetek deklarálják az interfész szerződését, és nem próbálják meg leírni a szerződés megvalósítását. A Kódelemzési eszköz futtatásának eredményei sok esetben a megfelelő széljegyzet hiányát tükrözik, és a széljegyzet hozzáadásával a hiányzó széljegyzetre vonatkozó figyelmeztetés is el lesz tiltva, és a további ellenőrzések engedélyezve vannak. További információ: SAL 2.0 Széljegyzetek Windows-illesztőprogramokhoz. További információ az SAL 2.0-ról: A C/C++ kódhibák csökkentése SAL-széljegyzetek használatával. Az SAL 2.0 az SAL 1.0 helyére lép. Az SAL 2.0-t a Windows 8 WDK-val kell használni. Ha az illesztőprogramok SAL 1.0-jával kapcsolatos információkra van szüksége, tekintse meg a Windows 7-hez készült WDK-val szállított PREfast for Drivers Annotations dokumentációt.
Az eredmény értelmezése
Az illesztőprogramok kódelemzése egyszerűen futtatható, és gyorsan fut, még nagyon nagy illesztőprogramokon és programokon is. A fejlesztő feladata a kimenet vizsgálata, a Kódelemzési eszköz által észlelt hibák elemzése, valamint a valós kódolási hibák megkülönböztetése a kódelemzési eszköz által tévesen értelmezett érvényes kódtól.
A Kódelemzési eszköz által észlelt összes figyelmeztetést leíró átfogó hivatkozásért tekintse meg az illesztőprogramok kódelemzésére vonatkozó figyelmeztetéseket. A Visual Studio kódelemzési eszközével kapcsolatos alapvető figyelmeztetésekkel kapcsolatos információkért tekintse meg a Kódelemzési figyelmeztetések című témakört.
A kódelemzési figyelmeztetések feloldása általában magában foglalja a forráskód szükség szerinti frissítését, vagy egy megjegyzés hozzáadását a függvényszerződés tisztázásához. A széljegyzetek hozzáadása lehetővé teszi, hogy az elemző kikényszerítse a szerződést az összes jövőbeli hívó számára, és javítja az olvashatóságot is.
Ha a kódelemzési eredmények olyan hibákat mutatnak, amelyeket a gondos vizsgálat után állapít meg, és még széljegyzetek használata esetén sem kerülhető el, kizárhatja vagy letilthatja ezeket a figyelmeztetéseket. További információért lásd: Hogyan futtassunk kódelemzést illesztőprogramokhoz.
Kapcsolódó témakörök
Kódelemzés futtatása illesztőprogramokhoz
Kódelemzési eszköz a Visual Studióban