Megosztás:


Illesztőprogramok kódelemzése – áttekintés

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.

Kódelemzés futtatása illesztőprogramokhoz

Kódelemzési eszköz a Visual Studióban

Illesztőprogramok kódelemzése – figyelmeztetések

Kódelemzési figyelmeztetések

SAL 2.0-s széljegyzetek Windows-illesztőprogramokhoz