Statikus kódelemzés

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2021. augusztus 13-án felülvizsgált verziótól ; az ellenőrzések 6 szerkesztést igényelnek .

A statikus kódelemzés egy szoftverelemzés , amelyet  a vizsgált programok tényleges végrehajtása nélkül hajtanak végre (a dinamikus elemzéssel ellentétben ) . A legtöbb esetben az elemzést a forráskód valamely verzióján hajtják végre , bár időnként valamilyen objektumkódot, például P-kódot vagy MSIL -kódot elemeznek . A kifejezést általában speciális szoftverrel (szoftverrel) végzett elemzésre alkalmazzák, míg a kézi elemzést "program megértésének", "program megértésének" (program megértésének vagy megértésének ) nevezik.

A használt eszköztől függően az elemzés mélysége az egyes utasítások viselkedésének meghatározásától az összes elérhető forráskódot tartalmazó elemzésig változhat. Az elemzés során kapott információk felhasználási módjai is eltérőek – a hibákat tartalmazó helyek azonosításától (segédprogramok, mint például a Lint ), a formális módszerekig, amelyek lehetővé teszik a program bármely tulajdonságának matematikai bizonyítását (például a viselkedés megfelelőségét a specifikáció).

Vannak, akik a szoftvermetrikát és a visszafejtést a statikus elemzés formáinak tekintik. A mérőszámok megszerzését ( angol  szoftverminőségi célkitűzések ) és a statikus elemzést gyakran kombinálják, különösen beágyazott rendszerek létrehozásakor. [egy]


A statikus elemzés alapelvei

A legtöbb fordító (például a GNU C Compiler ) „ figyelmeztetéseket ” ( angol  figyelmeztetések ) jelenít meg – olyan üzeneteket, amelyek szerint a kód, mivel szintaktikailag helyes, valószínűleg hibát tartalmaz. Például:

int x ; int y = x + 2 ; // Az x változó nincs inicializálva!

Ez a legegyszerűbb statikus elemzés. A fordító számos más fontos tulajdonsággal rendelkezik - mindenekelőtt a munka sebessége és a gépi kód minősége, ezért a fordítók csak a nyilvánvaló hibákat ellenőrzik a kódban. A statikus analizátorokat részletesebb kódelemzésre tervezték.

A statikus analizátorok által észlelt hibák típusai

  • Meghatározatlan viselkedés  – inicializálatlan változók, hozzáférés a NULL mutatókhoz. A fordítók a legegyszerűbb eseteket is jelzik.
  • A könyvtárhasználati algoritmus megsértése. Például mindegyiknek fopenszüksége van fclose. És ha a fájlváltozó a fájl bezárása előtt elveszik, az elemző hibát jelezhet.
  • Gyakori forgatókönyvek, amelyek a következőhöz vezetnek : . A C szabványkönyvtár számos technikai hibájáról híres. Egyes funkciók, mint például a gets, eredendően nem biztonságosak. sprintfés strcpycsak bizonyos feltételek mellett biztonságos.
  • Puffertúlcsordulásról akkor beszélünk  , amikor egy számítógépes program a memóriában lefoglalt puffer határain túlmutató adatokat ír.
void doSomething ( const char * x ) { karakterek [ 40 ] ; sprintf ( s , "[%s]" , x ); // sprintf a helyi pufferbe, túlcsordulás lehetséges .... } Object * p = getObject (); int pNum = reinterpret_cast < int > ( p ); // igaz x86-32-n, x64-en a mutató egy része elveszik; intptr_t kell
  • Hibák az ismétlődő kódban. Sok program ugyanazt a dolgot többször is végrehajtja különböző argumentumokkal. Általában az ismétlődő töredékeket nem a semmiből írják, hanem sokszorosítják és javítják.
dest . x = src . x + dx ; dest . y = src . y + dx ; // Hiba, kell dy!
  • Formázási karakterlánc hibák – az ehhez hasonló függvényekben előfordulhatnak printfolyan hibák, amelyekben a formátum karakterlánc nem egyezik a paraméterek tényleges típusával.
std :: wstrings ; _ printf ( "s az %s" , s );
  • A függvénynek átadott változatlan paraméter a programmal szembeni megváltozott követelmények jele. Egyszer a paraméter engedélyezve volt, de most már nincs rá szükség. Ebben az esetben a programozó teljesen megszabadulhat ettől a paramétertől - és a hozzá kapcsolódó logikától.
void doSomething ( int n , bool flag ) // flag mindig igaz { ha ( zászló ) { // némi logika } más { // kód van, de nem használt } } doSomething ( n , igaz ); ... doSomething ( 10 , igaz ); ... doSomething ( x.size ( ) , true );
  • Memória és egyéb források szivárgása. Az igazságosság kedvéért meg kell jegyezni, hogy a statikus analizátorok általában alulmaradnak a dinamikus kódelemzőkkel szemben a szivárgásészlelés területén. [2]
Traverser * t = new Traverser ( Név ); ha ( ! t -> Érvényes ()) { return HAMIS ; // Véletlenül a törlés előtt írta a return parancsot. törölje t ; }
  • Egyéb hibák - a szabványos könyvtárak számos funkciójának nincs mellékhatása , és nincs értelme eljárásként hívni őket.
std :: karakterláncok ; _ ... s . üres (); // a kód nem csinál semmit; valószínűleg s.clear()-re gondoltál?

Alkalmazás

Az utóbbi időben a statikus elemzést egyre gyakrabban alkalmazzák a rendkívül megbízható számítógépes rendszerekben használt szoftverek tulajdonságainak ellenőrzésére , különösen az életkritikus ( biztonságkritikus). Arra is használják, hogy olyan kódot találjanak, amely potenciálisan sebezhetőséget tartalmaz (néha statikus alkalmazásbiztonsági tesztelésnek , SAST-nak hívják). [3]

A statikus elemzést folyamatosan használják a kritikus szoftverekhez a következő területeken:

  1. Szoftver orvosi eszközökhöz. [négy]
  2. Szoftver atomerőművekhez és reaktorvédelmi rendszerekhez ( Reactor Protection Systems ) [5]
  3. Repülési szoftver (dinamikus elemzéssel kombinálva) [6]
  4. Szoftver a közúti vagy vasúti közlekedésben [7]

A VDC 2012-es adatai szerint a beágyazott szoftverfejlesztők hozzávetőleg 28%-a használ statikus elemző eszközöket, és 39%-uk 2 éven belül elkezdi használni őket. [nyolc]

Formális metódusok

Statikus elemző eszközök

Elemző nyelvi eszközök, amelyek közül néhányat a CISO CLUB [9] emel ki :

C/C++:

C#:

Jáva:

JavaScript:

.HÁLÓ:

  • A .NET Compiler Platform ( Roslyn ) egy C# és VB.NET fordítói keretrendszer, amely interfészt biztosít az elemző számára.
  • fxcop
  • Microsoft FxCop
  • NDepend
  • PVS Stúdió
  • ReSharper
  • stíluszsaru
  • YASCA

PHP:

  • Graudit
  • RIPS
  • Solar appScreener
  • YASCA
  • Visual Code Grappler
  • Code Warrior

Python: [11] [12]

  • Flake8
  • Graudit
  • Pychecker
  • Pylint
  • McCabe
  • Pyflakes
  • pycodestyle
  • Solar appScreener
  • YASCA

rubin:


Egyéb:

  • A T-SQL Analyzer egy olyan eszköz, amely meg tudja tekinteni a Microsoft SQL Server 2005 vagy 2008 rendszert futtató adatbázisok programmoduljait, és észleli a rossz kódminőséggel kapcsolatos lehetséges problémákat.
  • AK-VS 2 a CJSC NPO Echelontól (NDV keresése, veszélyes minták azonosítása a CWE által[13] )
  • A SonarQube  egy kódelemző és minőségirányítási platform, amely különféle programozási nyelveket támogat egy bővítményrendszeren keresztül.
  • Az AppChecker az NPO ESHELON kereskedelmi forgalomba hozott statikus kódelemzője, amelyet a C#, C/C++, Java, PHP nyelven fejlesztett alkalmazások forráskódjában található hibák automatikus keresésére terveztek.
  • A Svace egy statikus elemző eszköz, amelyet az ISP RAS fejlesztett ki . Támogatja a C/C++, Java, C# programozási nyelveket. [tizennégy]

Lásd még

Jegyzetek

  1. Szoftverminőségi célkitűzések a forráskódhoz. Proceedings Embedded Real Time Software and Systems 2010 Conference , ERTS2, Toulouse, Franciaország: Patrick Briand, Martin Brochet, Thierry Cambois, Emmanuel Coutenceau, Olivier Guetta, Daniel Mainberte, Frederic Mondot, Patrick Munier, Loic Noury, Philippe Repozio, Frederic //www.erts2010.org/Site/0ANDGY78/Fichier/PAPIERS%20ERTS%202010/ERTS2010_0035_final.pdf Archiválva : 2012. március 12. a Wayback Machine -nél
  2. Igen, a PVS-Studio képes észlelni a memóriaszivárgást . Archiválva : 2018. május 15., a Wayback Machine / PVS Studio Blog
  3. Szoftverbiztonság javítása precíz statikus és futásidejű elemzéssel, Benjamin Livshits, 7.3 „Static Techniques for Security” szakasz, Stanford doktori tézis, 2006. http://research.microsoft.com/en-us/um/people/livshits/papers /pdf/thesis.pdf Archiválva : 2011. június 5. a Wayback Machine -nél
  4. FDA infúziós pumpa szoftverbiztonsági kutatása az FDA-nál . Élelmiszer- és Gyógyszerügyi Hatóság (2010. szeptember 8.). Letöltve: 2010. szeptember 9. Az eredetiből archiválva : 2010. szeptember 1..
  5. Számítógép alapú biztonsági rendszerek – műszaki útmutató a digitális számítógépes védelmi rendszerek szoftveres szempontjainak értékeléséhez, http://www.hse.gov.uk/nuclear/operational/tech_asst_guides/tast046.pdf Archiválva : 2012. október 9. a Wayback Machine -nél
  6. Helyezze el a papírt CAST-9. Megfontolások a Software Assurance biztonságtechnikai megközelítéseinek értékeléséhez, archiválva : 2013. október 6., a Wayback Machine // FAA, Certification Authorities Software Team (CAST), 2002. január: „Ellenőrzés. A statikus és dinamikus elemzések kombinációját a kérelmezőnek/fejlesztőnek kell meghatároznia, és alkalmaznia kell a szoftverre.”
  7. Bill Graham. Statikus elemzés, biztonsági szempontból kritikus vasúti szoftver és EN 50128 . Letöltve: 2016. szeptember 2. Az eredetiből archiválva : 2016. augusztus 25..
  8. VDC kutatási automatizált hibamegelőzés a beágyazott szoftverek minőségéért . VDC Research (2012. február 1.). Letöltve: 2012. április 10. Az eredetiből archiválva : 2012. április 7..
  9. A legjobb ingyenes eszközök statikus kódelemzéshez  (orosz)  ? . cisoclub.ru (2021. február 11.). Letöltve: 2021. november 19. Az eredetiből archiválva : 2021. szeptember 19.
  10. Clang Static Analyzer . clang-analyzer.llvm.org. Letöltve: 2016. május 14. Az eredetiből archiválva : 2011. október 8..
  11. Anand Balachandran Pillai. Szoftverarchitektúra Python segítségével. - Packt Kiadó Kft., 2017. - P. 63-64.
  12. Adam Goucher, Tim Riley. Gyönyörű tesztelés: A vezető szakemberek megmutatják, hogyan fejlesztik a szoftvert . - O'Reilly Media, Inc., 2009. -  126. o .
  13. A programkód ellenőrzése a biztonsági követelményekhez - Információbiztonság, audit, programkód, biztonság, Alexey Markov, Valentin Tsirlov, CISSP, biztonsági kód ... Archív másolat 2016. május 27-én a Wayback Machine -nél , NPO Echelon CJSC
  14. Svace statikus analizátor. Kritikus hibák ipari keresése a biztonságos szoftverfejlesztési ciklusban . Letöltve: 2017. november 10. Az eredetiből archiválva : 2018. június 21.

Linkek