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:
- Software pro lékařské přístroje. [čtyři]
- Software pro jaderné elektrárny a systémy ochrany reaktorů ( Reactor Protection Systems ) [5]
- Letecký software (v kombinaci s dynamickou analýzou) [6]
- 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
- ↑ 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
- ↑ Ano, PVS-Studio dokáže detekovat úniky paměti Archivováno 15. května 2018 na Wayback Machine / PVS Studio Blog
- ↑ 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
- ↑ 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. (neurčitý)
- ↑ 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
- ↑ 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.“
- ↑ 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. (neurčitý)
- ↑ 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. (neurčitý)
- ↑ 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. (neurčitý)
- ↑ Clang Statický analyzátor . clang-analyzer.llvm.org. Získáno 14. 5. 2016. Archivováno z originálu 8. 10. 2011. (neurčitý)
- ↑ Anand Balachandran Pillai. Softwarová architektura s Pythonem. - Packt Publishing Ltd, 2017. - S. 63-64.
- ↑ Adam Goucher, Tim Riley. Krásné testování: Přední profesionálové odhalují, jak vylepšují software . - O'Reilly Media, Inc., 2009. - S. 126 .
- ↑ 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
- ↑ 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. (neurčitý)
Odkazy