Verona: Nyt sikkert sprog fra Microsoft skal løse problemer med gammel C og C++
Det fungerer ikke, det der med at spise elefanten én bid ad gangen.
I hvert fald når elefanten hedder software-fejl i gammel kode, som skal vedligeholdes.
Det synes Matthew Parkinson, som er forsker hos Microsoft, med en fortid som datalog på Cambridge-universitetet i England.
Han mener, at fremgangsmåden med at fikse enkelte fejl én af gangen i en stor kodebase ikke skalerer. Det fortalte han i et foredrag afholdt i sidste uge, arrangeret af UK Research and Innovation, som er et britisk partnerskab af universiteter, forskningsorganisationer, regering med mere.
Som man kan se på slidet til højre, stiger antallet af CVE-sårbarheder i Microsofts produkter år for år. Der er en mere end lineær stigning, og det skyldes ikke mindst, at firmaet forvalter en stor mængde gammel kode, skrevet i C og C++.
70 procent af sårbarheder er usikker hukommelse
Omkring 70 procent af de sårbarheder, Microsoft udstyrer med et CVE-nummer, skyldes problemer med usikker hukommelse. Det tal har ligget stabilt i de seneste 12 år.
Når Microsoft øger sin kodebase og benytter mere open source-software i sin kode, bliver dette problem ikke bedre, men værre.
Andre producenter, der også arbejder med C og C++, oplever det samme. Men de nye it-kæmper, som Google, Facebook og Amazon, har ikke helt samme problemer som Microsoft, hvis kode går mange tiår tilbage. Noget så simpelt som at håndtere et systems hukommelse er et af datalogiens centrale problemer. Der findes mange måder at løse det på, med forskellige fordele og ulemper. Problemets karakter ændrer sig også over tid, i takt med udviklingen af hardwarens forskellige dele. Det gælder især forholdet mellem cpu'en og hukommelsens hastighed, hvor cpu i forhold til tidligere i dag er mange gange hurtigere end hukommelsen. Gør-det-selv Smart pointers og borrowing Automatisk reference-optælling Garbage collection Software transactional memoryHukommelse i programmeringssprog
I C og C++ skal programmøren selv allokere og deallokere hukommelsen. Det sidste kan være svært, for her skal der holdes styr på, at der først frigives, når der ikke er flere referencer, og der skal frigives, så der ikke opstår hukommelseslækager, og helst så tidligt som muligt. Styresystemet sørger for, at en proces ikke uforvarende eller uretmæssigt læser og skriver steder, som ikke tilhører processen, men ellers er der frit slag. Det giver høj ydelse, men også ofte svær og tidskrævende fejlretning, især i fler-tråede programmer. Fejl kan ofte også medføre sikkerhedshuller.
I C++ og Rust er der faciliteter, der sørger for, at kun én pointer kan skrive til et sted i hukommelsen. I C++ hedder det ‘smart pointers’ og er valgfrit at anvende. I Rust skal man skrive ‘unsafe’ i koden for at slippe for de skrappe regler. Programmøren må ‘rundsende’ en reference mellem variabler, der også kan ‘udlånes.’ En ‘borrow-tjekker’ holder øje med at reglerne overholdes ved kompilering, og cirkulære strukturer som en linked list kan kun skabes med unsafe. Det giver en høj grad af sikkerhed sammen med høj ydelse, men nybegyndere kæmper ofte med borrow-tjekkeren.
I Swift benyttes Automatic Reference Counting, hvor kørselsmiljøet holder øje med, hvor mange referencer, der er til et sted i lagret. Når der ikke er flere referencer, kan hukommelsen frigives. Det lyder smart, men der er et catch: Hvis to objekter i en datastruktur peger på hinanden, frigives hukommelsen ikke. For at undgå hukommelseslækager findes der to slags referencer: almindelige og ‘svage’. De svage referencer tæller ikke med, og på denne måde kan en linked list, hvor den ene retning i strukturen udgøres af svage pointere, deallokeres et element af gangen. Det giver ikke pauser i programudførelsen som med garbage collection, men som i C er det programmørens ansvar at undgå hukommelseslækager.
I Java, .Net og Go benyttes garbage collection, hvor en proces i kørselsmiljøet kigger alle eller visse referencer igennem, og deallokerer dem, der ikke længere anvendes af variabler. Sammen med Rust’s borrow-tjekker er det den mest sikre fremgangsmåde, og den nemmeste for programmøren, der ikke skal foretage sig noget. Men det er svært at undgå små pauser i udførelsen, mens skraldet indsamles og genbruges. Eksempelvis mener holdet bag Firefox ikke, man kan bruge sprog med garbage collection til at udvikle en browser med, da det giver uacceptabel latency og dermed en dårlig brugeroplevelse.
Der findes flere modeller end de ovenstående. I software transactional memory tilgås hukommelsen på samme måde som en database-transaktion, med de fordele og ulemper, det giver. Modellen er nem at forstå og spiller godt sammen med processer, der skal skrive til fælles hukommelse. Det kan bruges i Haskell.
Der findes hukommelsessikre sprog som C# og Java, men C og C++ kan nogle tricks, som de sikre sprog ikke kan tilbyde i helt samme omfang.
C++ har nemlig dyder, der gør det attraktivt og undertiden helt uomgåeligt. Sproget er hurtigt, det kan køre med begrænset hukommelse og diskforbrug, det er et modent sprog, det har forudsigelig afvikling, og dets platform-uafhængighed er næsten uden sidestykke.
Endelig kræver det ikke nødvendigvis installation af andre biblioteker eller komponenter. Men som nævnt fører det også til fejl, der ofte handler om håndtering af hukommelse.
Microsoft har eksperimenteret med Rust til nye komponenter. Og det sprog byder på de fordele, som C og C++ har, men på en sikker facon. Men man har også kig på helt nye initiativer.
Dansk islæt
Firmaet kan ikke bare lægge den gamle kode bag sig, men ser i stedet på, hvordan koden kan gøres mere sikker.
Der findes nogle simple kneb til at rette fejl. Det kan eksempelvis være compilere, der initialiserer alle variable i kode skrevet i C og C++, beretter Matthew Parkinson i foredraget.
En anden fremgangsmåde er at se på sprogdesign og hvad Matthew Parkinson kalder for ‘compartmentalisation’.
Det vil sige at skære den gamle kode i bidder og putte dem i kasser, så sårbarhederne er skærmet af. Det kræver nyt sprogdesign, og det er her, projekt Verona kommer ind i billedet.
Det er et samarbejde mellem Microsoft og Cambridge-universitetet, og foredraget i sidste uge er første gang, Matthew Parkinson løfter sløret for projektet.
Han karakteriserer det som ‘et nyt sprog til sikker infrastruktur-programmering.’ Med i projektet er danske Mads Torgersen, der er den nuværende chefdesigner bag C# og tidligere datalog på Aarhus Universitet. Han har har bidraget til Verona med ideer til, hvorledes et godt sprog designes, fortæller Matthew Parkinson.
Regioner i stedet for Rust
Problemfeltet hedder system-programmering, og det kan karakteriseres ved finkornet kontrol i forhold til resurser og følsomhed i forhold til latency, altså den tid, det tager at udføre en proces.
Det foregår tæt på maskinen, uden en abstraktion over hukommelsen, og uden typesikkerhed. Disse to forhold er usikre som udgangspunkt.
Løsningen er ifølge Matthew Parkinson at sige farvel til fælles adgang fra tråde til at ændre hukommelse, ‘samtidigt ejerskab’, der er en ny model til asynkron koordinering samt ‘lineære regioner’, som er et nyt bud på hukommelseshåndtering. De ikke så nemme koncepter er illustreret i grafikken øverst i denne artikel.
»Ejerskabsmodellen i Verona er baseret på ‘regioner,’ grupper af objekter. Det er ikke som i Rust, hvor den er baseret på et enkelt objekt. I C ++ har du pointers, og det er baseret på objekter, og det er stort set pr. objekt. Men det er ikke, hvordan jeg tror om data og programmer. Jeg tænker på en datastruktur som en samling af objekter. Og den samling af objekter har et livsforløb,« forklarer Matthew Parkinson.
»Så ved at tage ejerskab på niveauet for ejerskab af objekter kommer vi meget tættere på det abstraktionsniveau, som folk bruger, og det giver os muligheden for at opbygge datastrukturer uden at gå uden om sikkerheden.«
Der er endnu ingen offentlige eksempler på Verona, men koden vil blive frigivet som open source i løbet af de kommende uger, siger Matthew Parkinson.

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.
Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.
Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.
Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.