Statická analýza kódu

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 13. srpna 2021; kontroly vyžadují 6 úprav .

Statická analýza kódu je softwarová  analýza prováděná (na rozdíl od dynamické analýzy ) bez skutečného provádění studovaných programů . Ve většině případů se analýza provádí na některé verzi zdrojového kódu , i když někdy je analyzován nějaký druh objektového kódu, jako je P-kód nebo MSIL kód . Termín se obvykle používá pro analýzu prováděnou speciálním softwarem (software), zatímco manuální analýza se nazývá „pochopení programu“, „pochopení programu“ ( pochopení nebo pochopení programu).

V závislosti na použitém nástroji se může hloubka analýzy lišit od určení chování jednotlivých příkazů až po analýzu, která zahrnuje veškerý dostupný zdrojový kód. Rozdílné jsou i způsoby využití informací získaných při analýze – od identifikace míst, která mohou obsahovat chyby (utility jako Lint ), až po formální metody, které umožňují matematicky prokázat jakékoli vlastnosti programu (například shodu chování s specifikace).

Někteří lidé považují softwarové metriky a reverzní inženýrství za formy statické analýzy. Získávání metrik ( anglické  cíle kvality softwaru ) a statická analýza se často kombinují, zejména při vytváření vestavěných systémů. [jeden]


Principy statické analýzy

Většina kompilátorů (například GNU C Compiler ) zobrazuje " varování " ( anglicky  warnings ) - zprávy, že kód, je syntakticky správný, s největší pravděpodobností obsahuje chybu. Například:

int x ; int y = x + 2 ; // Proměnná x není inicializována!

Toto je nejjednodušší statická analýza. Kompilátor má mnoho dalších důležitých vlastností - především rychlost práce a kvalitu strojového kódu, takže kompilátory kontrolují kód pouze na zjevné chyby. Statické analyzátory jsou určeny pro podrobnější analýzu kódu.

Typy chyb zjištěných statickými analyzátory

  • Nedefinované chování  - neinicializované proměnné, přístup k NULL ukazatelům. Kompilátory také signalizují nejjednodušší případy.
  • Porušení algoritmu pro používání knihovny. Každý fopenpotřebuje například fclose. A pokud dojde ke ztrátě proměnné souboru před uzavřením souboru, analyzátor může ohlásit chybu.
  • Běžné scénáře vedoucí k nezdokumentovanému chování . Standardní knihovna C je proslulá mnoha technickými poruchami. Některé funkce, jako je gets, jsou ze své podstaty nebezpečné. sprintfa strcpybezpečné pouze za určitých podmínek.
  • Přetečení vyrovnávací paměti  je, když počítačový program zapisuje data za hranice vyrovnávací paměti alokované v paměti.
void doSomething ( const char * x ) { znaky [ 40 ] ; sprintf ( s , "[%s]" , x ); // sprintf do místní vyrovnávací paměti, možné přetečení .... } Objekt * p = getObject (); int pNum = reinterpret_cast < int > ( p ); // true na x86-32, část ukazatele bude ztracena na x64; potřeba intptr_t
  • Chyby v opakujícím se kódu. Mnoho programů provádí stejnou věc několikrát s různými argumenty. Obvykle se opakující se fragmenty nezapisují od začátku, ale jsou duplikovány a opraveny.
cíl . x = zdroj . x + dx ; cíl . y = src . y + dx ; // Chyba, musím dy!
  • Chyby formátovacího řetězce – ve funkcích, jako je tato, printfmohou být chyby s neshodou formátovacího řetězce se skutečným typem parametrů.
std :: wstrings ; _ printf ( "s je %s" , s );
  • Nezměněný parametr předaný funkci je známkou změněných požadavků na program. Kdysi byl parametr povolen, ale nyní již není potřeba. V tomto případě se programátor může tohoto parametru úplně zbavit – a logiky s ním spojené.
void doSomething ( int n , bool flag ) // příznak je vždy pravdivý { if ( vlajka ) { // nějaká logika } else { // kód tam je, ale nepoužívá se } } doSomething ( n , true ); ... doSomething ( 10 , pravda ); ... doSomething ( x.size ( ) , true );
  • Únik paměti a dalších zdrojů. V zájmu spravedlnosti je třeba poznamenat, že v oblasti detekce úniků statické analyzátory obecně prohrávají s analyzátory dynamického kódu. [2]
Traverser * t = new Traverser ( Jméno ); if ( ! t -> Platné ()) { návrat FALSE ; // Omylem zapsal return před smazáním. odstranit t ; }
  • Další chyby - mnoho funkcí ze standardních knihoven nemá vedlejší účinky a volat je jako procedury nedává smysl.
std :: řetězce ; _ ... s . prázdný (); // kód nedělá nic; pravděpodobně jsi myslel s.clear()?

Aplikace

Statická analýza se v poslední době stále více používá k ověření vlastností softwaru používaného ve vysoce spolehlivých počítačových systémech, zejména životně kritických ( bezpečnostně kritických). Používá se také k nalezení kódu, který potenciálně obsahuje zranitelnosti (někdy nazývané Statické testování zabezpečení aplikací , SAST). [3]

Statická analýza se neustále používá pro kritický software v následujících oblastech:

  1. Software pro lékařské přístroje. [čtyři]
  2. Software pro jaderné elektrárny a systémy ochrany reaktorů ( Reactor Protection Systems ) [5]
  3. Letecký software (v kombinaci s dynamickou analýzou) [6]
  4. Software v silniční nebo železniční dopravě [7]

Podle údajů VDC za rok 2012 používá nástroje statické analýzy přibližně 28 % vývojářů vestavěného softwaru a 39 % je začne používat do 2 let. [osm]

Formální metody

Nástroje statické analýzy

Nástroje analytického jazyka, z nichž některé jsou zvýrazněny CISO CLUB [9] :

C/C++:

C#:

Jáva:

JavaScript:

.SÍŤ:

  • Platforma kompilátoru .NET ( Roslyn ) je rámec kompilátoru pro C# a VB.NET, který poskytuje rozhraní pro analyzátor.
  • fxcop
  • Microsoft FxCop
  • NZáleží
  • Studio PVS
  • ReSharper
  • stylcop
  • YASCA

PHP:

  • Graudit
  • RIPS
  • Solární aplikaceScreener
  • YASCA
  • Grappler vizuálního kódu
  • Bojovník s kódem

Python: [11] [12]

  • Vločka8
  • Graudit
  • Pychecker
  • Pylint
  • McCabe
  • Pyflakes
  • pycodestyle
  • Solární aplikaceScreener
  • YASCA

rubín:


Jiný:

  • T-SQL Analyzer je nástroj, který dokáže prohlížet programové moduly v databázích se systémem Microsoft SQL Server 2005 nebo 2008 a detekovat potenciální problémy související se špatnou kvalitou kódu.
  • AK-VS 2 od CJSC NPO Echelon (Vyhledávání NDV, identifikace nebezpečných vzorů CWE[13] )
  • SonarQube  je platforma pro analýzu kódu a řízení kvality s podporou různých programovacích jazyků prostřednictvím systému pluginů.
  • AppChecker je komerční analyzátor statického kódu od NPO ESHELON určený pro automatizované vyhledávání defektů ve zdrojovém kódu aplikací vyvinutých v C#, C/C++, Java, PHP.
  • Svace je nástroj pro statickou analýzu vyvinutý společností ISP RAS . Podporuje programovací jazyky C/C++, Java, C#. [čtrnáct]

Viz také

Poznámky

  1. Cíle kvality softwaru pro zdrojový kód. Proceedings Embedded Real Time Software and Systems 2010 Conference , ERTS2, Toulouse, Francie: Patrick Briand, Martin Brochet, Thierry Cambois, Emmanuel Coutenceau, Olivier Guetta, Daniel Mainberte, Frederic Mondot, Patrick Munier, Loic Noury, Philippe Spozio, Frederic Retailleau http: //www.erts2010.org/Site/0ANDGY78/Fichier/PAPIERS%20ERTS%202010/ERTS2010_0035_final.pdf Archivováno 12. března 2012 na Wayback Machine
  2. Ano, PVS-Studio dokáže detekovat úniky paměti Archivováno 15. května 2018 na Wayback Machine / PVS Studio Blog
  3. Zlepšení softwarového zabezpečení pomocí přesné statické a runtime analýzy, Benjamin Livshits, sekce 7.3 „Statické techniky pro zabezpečení“, Stanfordská doktorská práce, 2006. http://research.microsoft.com/en-us/um/people/livshits/papers /pdf/thesis.pdf Archivováno 5. června 2011 na Wayback Machine
  4. Výzkum bezpečnosti softwaru infuzní pumpy FDA na FDA . Food and Drug Administration (8. září 2010). Získáno 9. září 2010. Archivováno z originálu 1. září 2010.
  5. Počítačové bezpečnostní systémy – technické pokyny pro hodnocení softwarových aspektů digitálních počítačových ochranných systémů, http://www.hse.gov.uk/nuclear/operational/tech_asst_guides/tast046.pdf Archivováno 9. října 2012 na Wayback Machine
  6. Umístění papíru CAST-9. Úvahy o vyhodnocování přístupů bezpečnostního inženýrství k Software Assurance Archivováno 6. října 2013 na Wayback Machine // FAA, Softwarový tým certifikačních autorit (CAST), leden 2002: „Ověřování. Žadatel/vývojář by měl specifikovat kombinaci statických a dynamických analýz a aplikovat ji na software.“
  7. Bill Graham. Statická analýza, bezpečnostně kritický železniční software a EN 50128 . Získáno 2. září 2016. Archivováno z originálu 25. srpna 2016.
  8. Automatizovaná prevence defektů VDC Research pro kvalitu vestavěného softwaru . Výzkum VDC (1. února 2012). Získáno 10. dubna 2012. Archivováno z originálu 7. dubna 2012.
  9. TOP bezplatné nástroje pro analýzu statického kódu  (ruština)  ? . cisoclub.ru (11. února 2021). Získáno 19. listopadu 2021. Archivováno z originálu dne 19. září 2021.
  10. Clang Statický analyzátor . clang-analyzer.llvm.org. Získáno 14. 5. 2016. Archivováno z originálu 8. 10. 2011.
  11. Anand Balachandran Pillai. Softwarová architektura s Pythonem. - Packt Publishing Ltd, 2017. - S. 63-64.
  12. Adam Goucher, Tim Riley. Krásné testování: Přední profesionálové odhalují, jak vylepšují software . - O'Reilly Media, Inc., 2009. - S.  126 .
  13. Audit programového kódu pro bezpečnostní požadavky - Informační bezpečnost, audit, programový kód, bezpečnost, Alexey Markov, Valentin Tsirlov, CISSP, bezpečnostní kód ... Archivní kopie ze dne 27. května 2016 na Wayback Machine , NPO Echelon CJSC
  14. Statický analyzátor Svace. Průmyslové vyhledávání kritických chyb v cyklu vývoje bezpečného softwaru . Získáno 10. listopadu 2017. Archivováno z originálu 21. června 2018.

Odkazy