En programvarefeil , feil eller ganske enkelt feil (også kjent som en feil ) er et problem i et dataprogram eller programvaresystem som utløser et uønsket resultat. Programmer som hjelper til med å oppdage og eliminere programvarefeil kalles debuggere .
Blant de mange bemerkelsesverdige hendelsene forårsaket av denne typen feil er strålebehandlingsmaskinen Therac-25 på 1980- tallet, ødeleggelsen av romsonden Mariner 1 i 1962, [ 1 ] Ariane 5501 i 1996, [ 2 ] og Airbus A400M i 2015 [ 3 ] Også kjent var AT&T - nettverkshendelsene i 1990, eller Boeing 737 MAX -ulykkene i 2018 og 2019 som førte til at flyvningene deres ble suspendert i flere måneder på grunn av feil i MCAS-programvaren. [ 4 ]
I 2002 fant en studie på oppdrag fra det amerikanske handelsdepartementets National Institute of Standards and Technology at datafeil koster den amerikanske økonomien 59,5 milliarder dollar i året, eller 0,6 % av BNP. [ 5 ]
Den 9. september 1947 rapporterte fysiker og matematiker Grace Murray Hopper og andre som jobbet ved Harvard University på Mark II at datamaskinen hadde en feil i elektromagnetisk relé #70 på panel F. Da reléet ble undersøkt fant elektrifisert feil som førte til at reléet holdt seg åpent. Hopper tapet feilen til loggen med kommentaren: [ 6 ]
'Første faktiske tilfelle av feil ble funnet.' 'Første virkelige tilfelle av «bug» funnet.'Denne hendelsen blir feilaktig referert til som opprinnelsen til bruken av det engelske uttrykket bug ("bug") for å indikere et problem i en enhet eller et system. [ 7 ] [ 8 ] Faktisk var begrepet insekt allerede en del av det engelske språket, i det minste siden Thomas Alva Edison brukte det i notatene sine i 1872, i et brev i 1878 for å referere til mekaniske eller elektriske defekter, [ 9 ] og i 1889 med henvisning til interferens og funksjonsfeil i en fonograf. [ 10 ] Hopper kan først ha assosiert det med informatikk, i dette tilfellet relatert til et ekte insekt. På den annen side, selv på 50- tallet av 1900-tallet , brukte Hopper også begrepet debug på engelsk når han snakket om feilsøkingsfeil i programmeringskoder. Den første registrerte bruken av begrepet er i 1945 Journal of the Royal Aeronautical Society : [ 11 ]
"Det varierte fra pre-design utvikling av essensielle komponenter, gjennom stadiet med typetest og flytest og "feilsøking" til senere utvikling av motoren." "Det gikk fra forhåndsutvikling av essensielle komponentdesign, gjennom testing, testflyging og feilsøking og endte med motorutvikling."De fleste programmeringsspråk har minst to typer feil som lar programmerere håndtere programfeil på en effektiv måte som ikke er aggressiv mot sluttbrukeren. Disse feilene er kompileringsfeil og kjøretidsfeil .
Kompileringsfeil forhindrer vanligvis kildekoden i å komme inn i et kjørbart program , mens kjøretidsfeil er spesifikke situasjoner der en hendelse utenfor programmet forhindrer kjøringen. Regelmessig må en effektiv programmerer prøve å finne ut hvordan han skal reagere på disse hendelsene, slik at det er programmet og ikke brukeren eller operativsystemet som løser problemet. For eksempel kan en ubehandlet feilblokk gjøre følgende:
Åpne filen "minfil" for skriving begynne å skrive data til filen min lukk filenHvis "minfil" ikke eksisterer (eller programmet eller brukeren ikke har tilstrekkelige rettigheter til å åpne den), vil operativsystemet returnere en feil som programmet ikke vil fange opp, og vi vil få en melding som "Filen "minfil" kan ikke åpnes for skriving" og knapper for å prøve på nytt, avbryte og avbryte (i Windows-operativsystemet), som ikke har noen annen handling enn å gjenta seg selv på ubestemt tid uten mulighet for å forlate den syklusen annet enn å avslutte programmet med vold. En kode som vil fange opp feilen ved kjøretid vil være:
Åpne filen "minfil" for skriving Hvis operativsystemet tillater det begynn å skrive data til "min fil" hvis du ikke tillot det informerer brukeren om hva som skjer returnerer brukeren til et punkt der det ikke er noen konflikt (hovedmenyen, for eksempel) fortsette å fungere normaltUlike programmeringsspråk tillater forskjellige logiske konstruksjoner for programmerere å fange opp og løse feil under kjøring, for eksempel assert , try , og på feilsetninger i forskjellige programmeringsspråk.
Typen og mengden skade forårsaket av en programvarefeil kan påvirke beslutningsprosesser og retningslinjer for programvarekvalitet. I applikasjoner for bemannet romfart og for bil, må kvalitetskontroller av programvare være overlegne.
Problemet med år 2000 (Y2K) kan bli en økonomisk kollaps fordi mange programmer ville tolke år 2000 som om det var år 1900. Tilpasnings- og korrigeringsarbeidet til programmer unngikk alvorlige problemer.
Forstyrrelse av New York-børsen i 2012. 1. august 2012 forårsaket Knight Capital en forstyrrelse av aksjemarkedet som førte til at den mistet 75 % av markedsverdien på to dager. Knight Capital hadde SMARS-programvaren som automatisk administrerte, i høy hastighet og algoritmisk, ordrene som skulle utføres i markedet. Inne i koden hadde jeg «Power Peg»-funksjonaliteten, som jeg ikke hadde brukt siden 2003. Den var ikke fjernet og var tilgjengelig hvis den ble kalt. Telleren av aksjene solgt i hver ordre ble tilfeldigvis utført av en annen del av koden utenfor "Power Peg" siden 2005. Fra og med 27. juli 2012 begynte installasjonen av den nye SMARS-programvaren i faser på serverne over flere dager. Den nye programvaren inneholdt en tag som i den gamle aktiverte "Power Peg." En tekniker glemte å sikkerhetskopiere den nye RLP-koden til en av de åtte SMARS-serverne som håndterte de automatiserte aksjekjøps- og salgsordrene. 1. august 2012 sendte den ikke-oppdaterte serveren som kjørte den gamle «Power Peg»-koden millioner av bestillinger fordi telleren av handlinger utført i hver ordre ikke ble kommunisert til SMARS, og derfor stoppet kjøpsprosessen aldri. I et forsøk på å fikse problemet avinstallerte de den nye RLP-koden fra de syv serverne som fungerte riktig, noe som gjorde problemet verre. På 45 minutter utførte den 4 millioner handler på 154 aksjer som flyttet 397 millioner aksjer, mens den i stedet burde ha utført 212 små ordrer. Knight Capital tapte 460 millioner dollar og ble bøtelagt 12 millioner dollar av SEC for brudd på børsbestemmelser. [ 12 ]
To ulykker med Boeing 737 MAX-flyene i 2018 og 2019 førte til at FAA initierte Flight Suspension av Boeing 737 MAX i flere måneder den 13. mars 2019 på grunn av feil i MCAS (Maneuvering Characteristics Augmentation System) programvare. Characteristic Augmentation Augmentation. System). [ 4 ] 346 mennesker omkom i ulykkene. FAA tillot produsenter som Boeing å utstede flysertifikater for sine fly. I november 2019 suspenderte FAA Boeings mulighet til å utstede sertifikater for MAX-fly.
MCAS i MAX ble designet for å aktiveres ved å bruke signalet fra en av flyets to angrepsvinkelsensorer, noe som gjør det mottakelig for enkeltpunktsfeil . Når MCAS oppdager at flyet er i manuell modus med klaffene oppe og høy angrepsvinkel, justerer den den horisontale stabilisatoren for å senke nesen slik at piloten ikke klatrer for fort og forårsaker stopp. Selv om MCAS-systemet kunne forårsake utilsiktede dykk, ble det ikke nevnt i fly- og treningsmanualene, så pilotene var ikke klar over det. [ 13 ] I mars 2019 ble 387 MAX-fly satt på bakken, og utførte 8600 ukentlige flyvninger for 59 flyselskaper. I januar 2020 estimerte Boeing at de i 2019 tapte 18,4 milliarder dollar og fikk kansellert 183 MAX-ordrer. I 2019 varierte prisen på en Boeing 737 MAX fra 100 til 135 millioner USD.
Therac -25 var en strålebehandlingsmaskin produsert av AECL, etterfølgeren til Therac-6 og Therac-20-modellene (tidligere enheter ble produsert i samarbeid med CGR). Enheten ble kompromittert i minst seks ulykker mellom 1985 og 1987, der flere pasienter fikk overdoser med stråling. Tre av pasientene døde som en direkte konsekvens. Disse ulykkene stilte spørsmål ved påliteligheten til programvarekontroll av kritiske sikkerhetssystemer, og ble en casestudie innen medisinsk informatikk og programvareteknikk. Undersøkelseskommisjonen konkluderte med at de primære årsakene til ulykkene var dårlig utviklingspraksis, kravanalyse og dårlig programvaredesign, og ikke isolerte feil i kildekoden. Spesielt Therac-25-programmet ble designet på en slik måte at det var nesten umulig å finne og fikse feil automatisk.
Systemet brukte ikke et standard operativsystem. I stedet kjørte den et proprietært operativsystem skrevet i PDP-11 assembly-språk for å kjøre på 32K PDP-11 /23-datamaskinen. [ 14 ] Når systemet rapporterte en feil og stoppet røntgenbildene, viste det bare meldingen "FEIL" etterfulgt av et tall fra 1 til 64. Maskinhåndboken forklarte ikke problemet eller viste kodefeil, og derfor operatøren endte opp med å lukke advarselen og fortsette behandlingen. AECL-ansatte og maskinoperatører trodde i utgangspunktet ikke på pasientklager på grunn av deres høye tillit til maskinen.
Engineering hadde gjenbrukt kode fra eldre modeller (Therac-6 og Therac-20), som hadde mekaniske sikkerhetssystemer.
Feilen oppsto bare når en bestemt sekvens av nøkler raskt ble lagt inn i VT100 -terminalen , som kontrollerte Therac-25s PDP-11- datamaskin. Operatøren hadde fylt ut alle boksene og var i bestillingsboksen da han skjønte at det var en feil i stråletypeboksen som inneholdt en X (røntgen) når den skulle inneholde en E (elektronstråle). For å rette det brukte jeg ↑ -markøren for å gå opp til boksen, skrive en E og gå ned med ↓ -markøren til kommandoboksen, skrive en B og trykke ↵ Enter . Den komplette sekvensen var ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ E ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ B ↵ Enter . Hvis denne sekvensen ble utført på mindre enn 8 sekunder, produserte maskinen en stråling som kunne være opptil 1000 ganger den som var ment å bli påført.
Dette skjedde svært sjelden, og det var ukjent at det var en slik rasebetingelsesfeil der utgangen eller tilstanden til en prosess er avhengig av en sekvens av hendelser som blir utført i vilkårlig rekkefølge og kommer til å fungere på samme ressurs. En feil kan oppstå når slike hendelser ikke kommer (utføres) i den rekkefølgen planleggeren forventet.
Programmet endret flaggvariabelen "Class3" ved å øke den hver gang den kjørte tilpasningstestrutinen, i stedet for å tilordne den en fast verdi. Variabelen "Class3" var 1 byte lang og dens mulige verdier varierte fra 0 til 255. Når verdien var 255 og 1 ble lagt til, ble variabelen "Class3" lik 0. Når variabelen "Class3" var lik 0, indikerte det at elektronstrålen kunne utløses og kollimatorens posisjon ble ikke kontrollert. [ 14 ]
Tilpasningstestrutinen ble kjørt hundrevis av ganger hver økt for én pasient. En gang i hver 256 utførelse av rutinen hadde variabelen "Class3" verdien 0 (utilsiktet), kollimatoren ble ikke sjekket, og eventuelle kollimatorfeil ble ikke oppdaget. Overdosen skjedde hvis operatøren trykket på Set -knappen akkurat i det øyeblikket variabelen "Class3" endret seg fra 255 til 0 (overløp). Programvaren brukte deretter den maksimale effekten på 25 MeV uten å ha målet på plass og uten skanning. AECL korrigerte dette problemet ved å sette variabelen "Class3" til en annen verdi enn 0 hver gang den gikk gjennom tilpasningstestrutinen, i stedet for å øke den. [ 14 ] [ 15 ]
En bruker av Debian OpenSSL-pakken rapporterte en melding om retting. I ferd med å fikse problemet, rotet en programmerer tilfeldig tallgeneratoren. Den mangelfulle oppdateringen ble utgitt i september 2006 med OpenSSL versjon 0.9.8c-1. Før april 2008 ble ikke problemet oppdaget. Alle kryptografiske nøkler generert med den versjonen er kompromittert fordi "tilfeldige" tall er lett forutsigbare, og data kryptert med dem er også sårbare. Dette utgjorde en trussel for mange applikasjoner som er avhengige av kryptering som S/MIME , Tor , tilkoblinger beskyttet av SSL eller TLS og SSH . Rettet i OpenSSL versjon 0.9.8c-4etch3. [ 16 ]
Heartbleed ( spansk : hemorrhage of heart) er et programvaresikkerhetshull i OpenSSL open source - biblioteket , kun sårbart i versjon 1.0.1f , som lar en angriper lese minnet til en server eller en klient, slik at det for eksempel kan hentes SSL private nøkler fra en server. [ 17 ]
Den sårbare koden ble bredt tatt i bruk og brukt med utgivelsen av OpenSSL versjon 1.0.1 14. mars 2012. Heartbeat-støtte ble aktivert som standard, noe som førte til at berørte versjoner var sårbare som standard. [ 18 ] [ 19 ] [ 20 ]
RFC 6520 Heartbeat Extension tester sikre TLS/DTLS-kommunikasjonskoblinger ved å tillate en datamaskin i den ene enden av en tilkobling å sende en "Heartbeat Request"-melding, som består av en nyttelast , typisk en tekststreng, sammen med lengden på nevnte nyttelast som et 16-bits heltall. Den mottakende datamaskinen må da sende nøyaktig samme nyttelast tilbake til avsenderen. Berørte versjoner av OpenSSL tildeler en minnebuffer for meldingen som skal returneres basert på lengdefeltet i forespørselsmeldingen, uten hensyn til den faktiske nyttelaststørrelsen til den meldingen. På grunn av denne unnlatelsen av å kontrollere riktige grenser, består den returnerte meldingen av nyttelasten, muligens etterfulgt av alt annet som er tildelt i minnebufferen . Canada Revenue Agency rapporterte tyveri av personnummer som tilhører 900 skattebetalere, og opplyser at de ]21[ble åpnet gjennom å utnytte feilen over en seks-timers periode 8. april 2014. [ 22 ] Den første faste versjonen, 1.0.1g, ble utgitt 7. april 2014.
Cyberpunk 2077 var en flott sak om feil, spillet på tidspunktet for utgivelsen var fullt av feil og bugs, over tid fikset de det, men først ga de det kallenavnet: ''cyberbugs''