Programanalyse - Program analysis
| Programvare utvikling |
|---|
I informatikk er programanalyse prosessen med å automatisk analysere oppførselen til dataprogrammer angående en egenskap som korrekthet, robusthet, sikkerhet og livskraft. Programanalyse fokuserer på to hovedområder: programoptimalisering og korrekthet av programmet . Den første fokuserer på å forbedre programmets ytelse samtidig som ressursbruken reduseres, mens den siste fokuserer på å sikre at programmet gjør det det skal gjøre.
Programanalyse kan utføres uten å utføre programmet ( statisk programanalyse ), under kjøretid ( dynamisk programanalyse ) eller i en kombinasjon av begge.
Statisk programanalyse
I forbindelse med programkorrigering kan statisk analyse oppdage sårbarheter under utviklingsfasen av programmet. Disse sårbarhetene er lettere å korrigere enn de som ble funnet under testfasen siden statisk analyse fører til roten til sårbarheten.
På grunn av at mange former for statisk analyse er beregningsmessig uavgjort, vil ikke mekanismene for å gjøre det alltid avsluttes med det riktige svaret - enten fordi de noen ganger returnerer et falskt negativt ("ingen problemer funnet" når koden faktisk har problemer) eller en falskt positivt, eller fordi de aldri returnerer feil svar, men noen ganger aldri avsluttes. Til tross for begrensningene, kan den første typen mekanisme redusere antallet sårbarheter, mens den andre noen ganger kan gi sterk sikkerhet for mangelen på en bestemt klasse av sårbarheter.
Feil optimalisering er svært uønsket. Så, i forbindelse med programoptimalisering, er det to hovedstrategier for å håndtere beregningsmessig usikker analyse:
- En optimizer som forventes å fullføres på relativt kort tid, for eksempel optimeren i en optimaliserende kompilator, kan bruke en avkortet versjon av en analyse som garantert vil fullføres på en begrenset tid, og garantert bare finner riktig optimaliseringer.
- Et tredjeparts optimaliseringsverktøy kan implementeres på en slik måte at det aldri produseres feil optimalisering, men også slik at det i noen situasjoner kan fortsette å kjøre på ubestemt tid til det finner en (som kanskje aldri skjer). I dette tilfellet må utvikleren som bruker verktøyet stoppe verktøyet og unngå å kjøre verktøyet på den koden igjen (eller muligens endre koden for å unngå å snuble i verktøyet).
Men det er også en tredje strategi som er noen ganger aktuelt for språk som ikke er helt fastsatt, for eksempel C . En optimaliserende kompilator har frihet til å generere kode som gjør alt ved kjøretid - til og med krasjer - hvis den støter på kildekoden hvis semantikk er uspesifisert av språkstandarden i bruk.
Kontrollflyt
Formålet med kontrollflyt-analyse er å skaffe informasjon om hvilke funksjoner som kan kalles på forskjellige punkter under utførelsen av et program. Den innsamlede informasjonen er representert ved en kontroll-flyt-graf (CFG) der nodene er instruksjoner for programmet og kantene representerer strømmen av kontroll. Ved å identifisere kodeblokker og sløyfer blir CFG et utgangspunkt for kompilatoroptimaliseringer.
Dataflyt analyse
Datastrømsanalyse er en teknikk designet for å samle informasjon om verdiene på hvert punkt i programmet og hvordan de endres over tid. Denne teknikken brukes ofte av kompilatorer for å optimalisere koden. Et av de mest kjente eksemplene på datastrømsanalyser er fargekontroll, som består i å vurdere alle variabler som inneholder brukerleverte data-som regnes som "besmittet", det vil si usikre-og forhindre at disse variablene blir brukt til de er blitt desinfisert. Denne teknikken brukes ofte for å forhindre SQL -injeksjonsangrep . Taint -kontroll kan utføres statisk eller dynamisk.
Abstrakt tolkning
Abstrakt tolkning tillater ekstraksjon av informasjon om en mulig kjøring av et program uten å faktisk utføre programmet. Denne informasjonen kan brukes av kompilatorer for å se etter mulige optimaliseringer eller for å sertifisere et program mot visse klasser av feil.
Type systemer
Typesystemer knytter typer til programmer som oppfyller visse krav. Hensikten er å velge en delsett av programmer på et språk som anses som riktige i henhold til en eiendom.
- Typekontroll - kontroller om programmet godtas av typesystemet.
Typekontroll brukes i programmering for å begrense hvordan et programmeringsobjekt brukes og hva de kan gjøre. Dette gjøres av kompilatoren eller tolken. Typekontroll kan også bidra til å forhindre sårbarheter ved å sikre at en signert verdi ikke tilskrives en usignert variabel. Typekontroll kan utføres statisk (på kompileringstidspunktet), dynamisk (ved kjøretid) eller en kombinasjon av begge.
Statisk typeinformasjon (enten utledet eller eksplisitt levert av typeanmerkninger i kildekoden) kan også brukes til å gjøre optimaliseringer, for eksempel å erstatte boksede matriser med uboksede matriser.
Effektsystemer
Effektsystemer er formelle systemer designet for å representere effektene som utfører en funksjon eller metode kan ha. En effekt kodifiserer det som blir gjort og med det det blir gjort - vanligvis referert til som henholdsvis effekttype og region.
Modellkontroll
Modellkontroll refererer til strenge, formelle og automatiserte måter å kontrollere om en modell (som i denne sammenheng betyr en formell modell av et stykke kode, selv om det i andre sammenhenger kan være en modell av en maskinvare) er i samsvar med en gitt spesifikasjon. På grunn av kodens iboende endelige tilstand, og både spesifikasjonen og koden som kan konverteres til logiske formler, er det mulig å kontrollere om systemet bryter spesifikasjonen ved hjelp av effektive algoritmiske metoder.
Dynamisk programanalyse
Dynamisk analyse kan bruke kjøretidskunnskap om programmet for å øke analysens presisjon, samtidig som det gir kjøretidsbeskyttelse, men det kan bare analysere en enkelt kjøring av problemet og kan forringe programmets ytelse på grunn av kjøretidskontrollene.
Testing
Programvare bør testes for å sikre kvaliteten og at den fungerer som den skal på en pålitelig måte, og at den ikke vil skape konflikter med annen programvare som kan fungere ved siden av den. Testene utføres ved å utføre programmet med en input og evaluere dets oppførsel og produsert output. Selv om det ikke er angitt noen sikkerhetskrav, bør det utføres ytterligere sikkerhetstester for å sikre at en angriper ikke kan tukle med programvaren og stjele informasjon, forstyrre programvarens normale drift eller bruke den som en pivot for å angripe brukerne.
Overvåkning
Programovervåking registrerer og logger forskjellige typer informasjon om programmet, for eksempel ressursbruk, hendelser og interaksjoner, slik at det kan gjennomgås for å finne eller finne årsaker til unormal oppførsel. Videre kan den brukes til å utføre sikkerhetsrevisjoner. Automatisert overvåking av programmer blir noen ganger referert til som kjøretidsverifisering .
Programskjæring
For en gitt delmengde av et programs oppførsel består programskjæring i å redusere programmet til minimumsformen som fremdeles produserer den valgte oppførselen. Det reduserte programmet kalles et "stykke" og er en trofast fremstilling av det opprinnelige programmet innenfor domenet til den angitte oppførselsundersettet. Vanligvis er det å finne et stykke et uløselig problem, men ved å spesifisere målatferden som er delsett av verdiene til et sett med variabler, er det mulig å få omtrentlige skiver ved hjelp av en datastrømalgoritme. Disse skivene brukes vanligvis av utviklere under feilsøking for å finne feilkilden.
Se også
- Automatisk gjennomgang av kode
- Språkbasert sikkerhet
- Polyvarians
- Profilering (dataprogrammering)
- Programbekreftelse
- Oppsigelsesanalyse
Referanser
Videre lesning
- Agrawal, Hiralal; Horgan, Joseph R. Dynamisk programskjæring (PDF) .
- Chunlei, Wang; Gang, Zhao; Yiqi, Dai (2009). "En effektiv tilnærming til kontrollstrømssikkerhetsanalyse for binære kjørbare filer". 2009 andre IEEE internasjonale konferanse om informatikk og informasjonsteknologi . s. 272–276. doi : 10.1109/ICCSIT.2009.5234950 . ISBN 978-1-4244-4519-6.
- Nielson, Flemming; Nielson, Hanne Riis; Hankin, Chris (2005). Prinsipper for programanalyse . Springer Science+Business Media .
Eksterne linker
-
Medier relatert til programanalyse på Wikimedia Commons