Statisk kodanalys

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 13 augusti 2021; kontroller kräver 6 redigeringar .

Statisk kodanalys är en  mjukvaruanalys som utförs (till skillnad från dynamisk analys ) utan att faktiskt köra programmen som studeras. I de flesta fall utförs analysen på någon version av källkoden , även om ibland någon form av objektkod analyseras, såsom P-kod eller MSIL -kod . Termen används vanligtvis för analys utförd av speciell programvara (mjukvara), medan manuell analys kallas "programförståelse", "programförståelse" ( förstå eller förstå ett program).

Beroende på vilket verktyg som används kan analysdjupet variera från att bestämma beteendet hos enskilda påståenden till en analys som inkluderar all tillgänglig källkod. Sätten att använda informationen som erhålls under analysen är också olika - från att identifiera platser som kan innehålla fel (verktyg som Lint ), till formella metoder som gör att du matematiskt kan bevisa programmets egenskaper (till exempel överensstämmelse med beteendet med specifikationen).

Vissa människor anser att mjukvarumått och reverse engineering är former av statisk analys. Att erhålla mått ( engelska  mjukvarukvalitetsmål ) och statisk analys kombineras ofta, särskilt när man skapar inbyggda system. [ett]


Principer för statisk analys

De flesta kompilatorer (till exempel GNU C Compiler ) visar " warnings " ( engelska  varningar ) - meddelanden om att koden, som är syntaktisk korrekt, med största sannolikhet innehåller ett fel. Till exempel:

int x ; int y = x + 2 ; // Variabel x initieras inte!

Detta är den enklaste statiska analysen. Kompilatorn har många andra viktiga egenskaper - först och främst arbetshastigheten och kvaliteten på maskinkoden, så kompilatorer kontrollerar koden endast för uppenbara fel. Statiska analysatorer är designade för mer detaljerad kodanalys.

Typer av fel som upptäckts av statiska analysatorer

  • Odefinierat beteende  - oinitierade variabler, tillgång till NULL-pekare. Kompilatorer signalerar också de enklaste fallen.
  • Brott mot algoritmen för att använda biblioteket. Till exempel fopenbehöver varje fclose. Och om filvariabeln går förlorad innan filen stängs, kan analysatorn rapportera ett fel.
  • Vanliga scenarier som leder till odokumenterat beteende hos . C-standardbiblioteket är ökänt för sina många tekniska fel. Vissa funktioner, till exempel gets, är i sig osäkra. sprintfoch strcpyendast säker under vissa förhållanden.
  • Ett buffertspill  är när ett datorprogram skriver data utanför gränserna för en buffert som allokerats i minnet.
void doSomething ( const char * x ) { tecken [ 40 ] ; sprintf ( s , "[%s]" , x ); // sprintf till lokal buffert, spill möjligt .... } Objekt * p = getObject (); int pNum = reinterpret_cast < int > ( p ); // sant på x86-32, en del av pekaren kommer att gå förlorad på x64; behöver intptr_t
  • Buggar i upprepad kod. Många program kör samma sak flera gånger med olika argument. Vanligtvis skrivs inte repeterande fragment från grunden, utan dupliceras och korrigeras.
dest . x = src . x + dx ; dest . y = src . y + dx ; // Fel, behöver dy!
  • Formatsträngsfel - i funktioner som denna printfkan det finnas fel med en formatsträng som inte överensstämmer med den faktiska typen av parametrar.
std :: wstrings ; _ printf ( "s är %s" , s );
  • Den oförändrade parametern som skickas till funktionen är ett tecken på de ändrade kraven på programmet. En gång var parametern aktiverad, men nu behövs den inte längre. I det här fallet kan programmeraren bli av med denna parameter helt och hållet - och logiken som är associerad med den.
void doSomething ( int n , bool flagga ) // flaggan är alltid sann { om ( flagga ) { // lite logik } annat { // kod finns där, men används inte } } göraNågot ( n , sant ); ... doSomething ( 10 , sant ); ... doSomething ( x.size ( ) , sant );
  • Läckor av minne och andra resurser. För rättvisans skull bör det noteras att statiska analysatorer i allmänhet förlorar mot dynamiska kodanalysatorer inom området för läcksökning. [2]
Traverser * t = new Traverser ( Namn ); om ( ! t -> Giltigt ()) { returnera FALSK ; // Skrev av misstag retur innan radering. ta bort t ; }
  • Andra fel - många funktioner från standardbiblioteken har inga biverkningar , och att kalla dem som procedurer är inte vettigt.
std :: strängar ; _ ... s . tom (); // kod gör ingenting; du menade förmodligen s.clear()?

Applikation

På senare tid har statisk analys använts alltmer för att verifiera egenskaperna hos programvara som används i mycket tillförlitliga datorsystem, särskilt livskritiska ( säkerhetskritiska). Används även för att hitta kod som potentiellt innehåller sårbarheter (kallas ibland Static Application Security Testing , SAST). [3]

Statisk analys används ständigt för kritisk programvara inom följande områden:

  1. Programvara för medicinsk utrustning. [fyra]
  2. Programvara för kärnkraftverk och reaktorskyddssystem ( Reactor Protection Systems ) [5]
  3. Flygprogramvara (kombinerad med dynamisk analys) [6]
  4. Programvara för väg- eller järnvägstransporter [7]

Enligt VDC-data för 2012 använder cirka 28 % av utvecklarna av inbäddad programvara statiska analysverktyg och 39 % kommer att börja använda dem inom 2 år. [åtta]

Formella metoder

Statiska analysverktyg

Språkverktyg för analys, av vilka några lyfts fram av CISO CLUB [9] :

C/C++:

C#:

Java:

JavaScript:

.NETTO:

  • .NET Compiler Platform ( Roslyn ) är ett kompilatorramverk för C# och VB.NET som tillhandahåller ett gränssnitt till parsern.
  • fxcop
  • Microsoft FxCop
  • NBeroende
  • PVS Studio
  • ReSharper
  • stylecop
  • 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:


Övrig:

  • T-SQL Analyzer är ett verktyg som kan visa programmoduler i databaser som kör Microsoft SQL Server 2005 eller 2008 och upptäcka potentiella problem relaterade till dålig kodkvalitet.
  • AK-VS 2 från CJSC NPO Echelon (Sök efter NDV, identifiering av farliga mönster av CWE[13] )
  • SonarQube  är en kodanalys- och kvalitetsledningsplattform med stöd för olika programmeringsspråk genom ett system av plugins.
  • AppChecker är en kommersiell statisk kodanalysator från NPO ESHELON designad för automatisk sökning efter defekter i källkoden för applikationer utvecklade i C#, C/C++, Java, PHP.
  • Svace är ett statiskt analysverktyg utvecklat hos ISP RAS . Stöder C/C++, Java, C# programmeringsspråk. [fjorton]

Se även

Anteckningar

  1. Programvarukvalitetsmål för källkod. Proceedings Embedded Real Time Software and Systems 2010 Conference , ERTS2, Toulouse, Frankrike: 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 Arkiverad 12 mars 2012 på Wayback Machine
  2. Ja, PVS-Studio kan upptäcka minnesläckor Arkiverad 15 maj 2018 på Wayback Machine / PVS Studio Blog
  3. Improving Software Security with Precise Static and Runtime Analysis, Benjamin Livshits, avsnitt 7.3 "Static Techniques for Security", Stanford doktorsavhandling, 2006. http://research.microsoft.com/en-us/um/people/livshits/papers /pdf/thesis.pdf Arkiverad 5 juni 2011 på Wayback Machine
  4. ↑ Forskning om säkerhet för programvara för FDA - infusionspump hos FDA . Food and Drug Administration (8 september 2010). Hämtad 9 september 2010. Arkiverad från originalet 1 september 2010.
  5. Datorbaserade säkerhetssystem - teknisk vägledning för bedömning av mjukvaruaspekter av digitala datorbaserade skyddssystem, http://www.hse.gov.uk/nuclear/operational/tech_asst_guides/tast046.pdf Arkiverad 9 oktober 2012 på Wayback Machine
  6. Positionera papper CAST-9. Överväganden för att utvärdera säkerhetstekniska tillvägagångssätt för Software Assurance Arkiverad 6 oktober 2013 på Wayback Machine // FAA, Certification Authorities Software Team (CAST), januari 2002: "Verifiering. En kombination av både statiska och dynamiska analyser bör specificeras av sökanden/utvecklaren och tillämpas på programvaran."
  7. Bill Graham. Statisk analys, säkerhetskritisk järnvägsprogramvara och EN 50128 . Hämtad 2 september 2016. Arkiverad från originalet 25 augusti 2016.
  8. VDC Research Automated Defekt Prevention för Embedded Software Quality . VDC Research (1 februari 2012). Hämtad 10 april 2012. Arkiverad från originalet 7 april 2012.
  9. TOP fria verktyg för statisk kodanalys  (ryska)  ? . cisoclub.ru (11 februari 2021). Hämtad 19 november 2021. Arkiverad från originalet 19 september 2021.
  10. Clang statisk analysator . clang-analyzer.llvm.org. Hämtad 14 maj 2016. Arkiverad från originalet 8 oktober 2011.
  11. Anand Balachandran Pillai. Mjukvaruarkitektur med Python. - Packt Publishing Ltd, 2017. - S. 63-64.
  12. Adam Goucher, Tim Riley. Vackra tester: ledande proffs avslöjar hur de förbättrar programvaran . - O'Reilly Media, Inc., 2009. - S.  126 .
  13. Granskning av programkoden för säkerhetskrav - Informationssäkerhet, revision, programkod, säkerhet, Alexey Markov, Valentin Tsirlov, CISSP, säkerhetskod ... Arkivexemplar daterad 27 maj 2016 på Wayback Machine , NPO Echelon CJSC
  14. Svac statisk analysator. Industriell sökning efter kritiska buggar i den säkra mjukvaruutvecklingscykeln . Hämtad 10 november 2017. Arkiverad från originalet 21 juni 2018.

Länkar