C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Permalänk

C++ och dess framtid att programmera minnessäkert - Hur går utvecklingen?

Det nya heta heter "Minnessäkerhet" inom programmering. C och C++ pekas ut som språk som ska undvikas för nya projekt, av Microsoft, USA's regering och Rust-folket.

Men samtidigt så säger C++ folket att det går programmera minnessäkert med C++ om man använder rätt funktioner. Även deras C++ ledare Bjarne Stroustrup säger att C++ är på väg att bli ett minnessäkert språk.

Jag vill veta från er övriga hur denna utveckling går? Går det framåt med utvecklingen eller står det stilla? När kan vi förvänta oss ett minnessäkert C++? Hur i fall skulle detta gå till? Är det en flagga man aktiverar hos kompilatorn så den förbjuder en att använda vissa osäkra funktioner?

Permalänk
Hedersmedlem

Utan att ha tittat på vad Bjarne sade har jag en känsla av att ambitionsnivån är lite längre. Det handlar nog snarare om att man numera kan klara ganska mycket utan att själv behöva tänka så mycket på minneshantering och pekare.

Permalänk
Skrivet av Elgot:

Utan att ha tittat på vad Bjarne sade har jag en känsla av att ambitionsnivån är lite längre. Det handlar nog snarare om att man numera kan klara ganska mycket utan att själv behöva tänka så mycket på minneshantering och pekare.

Du menar att man kan allokera minne, utan minnesläckor? Lite som Java.

Permalänk
Medlem

"går programmera minnessäkert med C++ om man använder rätt funktioner"
Man kan inte lite på programmerarna och C++ har för mycket baggage för att konvertera gamla projekt till safe++ eller allt dom kallar det och om man har ett nytt projekt varför bygga det i C++ istället för ett språk som är minnessäkert i början.

Permalänk
Medlem

Gillar inte C++, fick avsmak för språket redan då jag gick kursen för 20+ år sedan p.g.a. en del syntax-konstruktioner som var helt bakvända i min värld. Det blev inte bättre när jag under flera år jobbade med support på språket och buggarna haglade omkring mig. Kompilatorn hade inte sina bästa år just då..

Bjarne anför att C++ är ett bra språk, bara man "använder rätt funktioner". Dessa funktioner läggs till efter hand och språket växer över tid och blir svåröverskådligt för nytillkomna. Men visst kan man se det positivt som att C++ blir ett "Heltäckande språk" med tiden, YMMW.

Permalänk
Hedersmedlem
Skrivet av heretic16:

Du menar att man kan allokera minne, utan minnesläckor? Lite som Java.

Ja, men det är kanske inga revolutionerade nyheter som väntas dyka upp utan snarare att det gradvis blir enklare att hålla sig till ”modern c++”.

Skrivet av mc68000:

Gillar inte C++, fick avsmak för språket redan då jag gick kursen för 20+ år sedan p.g.a. en del syntax-konstruktioner som var helt bakvända i min värld. Det blev inte bättre när jag under flera år jobbade med support på språket och buggarna haglade omkring mig. Kompilatorn hade inte sina bästa år just då..

Bjarne anför att C++ är ett bra språk, bara man "använder rätt funktioner". Dessa funktioner läggs till efter hand och språket växer över tid och blir svåröverskådligt för nytillkomna. Men visst kan man se det positivt som att C++ blir ett "Heltäckande språk" med tiden, YMMW.

Mycket har dock hänt de senaste decennierna. Dagens läroböcker ser rätt annorlunda ut än 20 år gamla.

Permalänk
Skrivet av Sinery:

"går programmera minnessäkert med C++ om man använder rätt funktioner"
Man kan inte lite på programmerarna och C++ har för mycket baggage för att konvertera gamla projekt till safe++ eller allt dom kallar det och om man har ett nytt projekt varför bygga det i C++ istället för ett språk som är minnessäkert i början.

Valet av C++ kan mycket bygga på flera faktorer.

  • Redan kännedom

  • Jobba i långtidsprojekt

  • Prestanda

  • Tillgänglighet

Enligt mitt tyckte så tror jag inte att det skulle vara ett problem att låta kompilatorn gå igenom C++ språket under kompileringen och varna vid minsta lilla minneslucka. Rätta mig gärna om jag är naiv.

Skrivet av mc68000:

Gillar inte C++, fick avsmak för språket redan då jag gick kursen för 20+ år sedan p.g.a. en del syntax-konstruktioner som var helt bakvända i min värld. Det blev inte bättre när jag under flera år jobbade med support på språket och buggarna haglade omkring mig. Kompilatorn hade inte sina bästa år just då..

Bjarne anför att C++ är ett bra språk, bara man "använder rätt funktioner". Dessa funktioner läggs till efter hand och språket växer över tid och blir svåröverskådligt för nytillkomna. Men visst kan man se det positivt som att C++ blir ett "Heltäckande språk" med tiden, YMMW.

Du igen! Min linux-dator går mycket bra. Tackar så mycket för hjälpen ska du ha. Bygger eget Linux nu med Buildroot. Gillar detta starkt!

C++ var faktiskt mitt första språk. Men jag föll för Java då Java hade detta läckra och otroligt fina Java Swing som var så nostalgisk redan då. Jag tyckte C++ var "tråkigt" för det bara var terminalbaserat. Tiden gick och jag hamnade vid C för jag programmerar mycket hårdvara. Ett fint lite språk som är enkelt att använda. Men efteråt så ville jag göra stora program, då tyckte jag att C++ borde väll vara industrins standard

Men man har hört mycket negativt om C++ t.ex. ovan, att språket är ej minnessäkert.
Jag skulle gärna vilja programmera C++ med att använda itereringar istället för for-satser. Då blir det som att skriva en hel operation på en enda rad. Detta skulle säkert vara väldigt optimerat istället för en for-sats + arrayer.

Skrivet av Elgot:

Ja, men det är kanske inga revolutionerade nyheter som väntas dyka upp utan snarare att det gradvis blir enklare att hålla sig till ”modern c++”.
Mycket har dock hänt de senaste decennierna. Dagens läroböcker ser rätt annorlunda ut än 20 år gamla.

Ja, modern C++ är att föredra. Men varför påtvingas inte detta mera? T.ex att GCC ska ha en valbar flagga som utvecklarna BÖR använda sig av, för att granska om koden har minnesläckor. Jag tycker detta borde vara en självklarhet om trenden riktas mot minnessäkerhet.

Håller med att C++ för 20 år sedan ser inte alls likt som C++ idag. C++ för 20 år sedan var mera C + klasser. Idag så tycker jag att man kan in princip skriva en komplett funktionalitet på en enda rad. Lite som Python eller Java med Lambda-funktioner.

Permalänk

När man ska utveckla något, så är första frågan vad vill man åstadkomma?
För väldigt många projekt så är det olika mål, ett av målen är att det ska vara billigt att utveckla och även underhålla. Där nyexaminerade personer ska kunna hoppa in i projektet direkt utan risk att de gör dumheter.
Där minnesläckage kan vara ett fel som är svårt att upptäcka och åtgärda.

C++ språket har sina fördelar som prestanda men ofta så är de andra sakerna viktigare... Jag förvånar ofta över min iPad med Apple M4 hur otroligt segt vissa applikationer ändå är på denna snabba krets, men det är inte precis prestanda som har prioriteras i dessa.

C++ språket utvecklas, säkerligen kommer det bli mer minnesäkert. Nu var det länge sedan jag kodade C++, men jag ville minnas att om man bara struntade i prestandan och hur koden såg ut, så gick de mesta problem lösa utan använda pekare och göra det bra minnessäkert.

Permalänk
Skrivet av lillaankan_i_dammen:

När man ska utveckla något, så är första frågan vad vill man åstadkomma?
För väldigt många projekt så är det olika mål, ett av målen är att det ska vara billigt att utveckla och även underhålla. Där nyexaminerade personer ska kunna hoppa i i projektet direkt utan risk att de gör dumheter.
Där minnesläckage kan vara ett fel som är svårt att upptäcka och åtgärda.

C++ språket har sina fördelar som prestanda men ofta så är de andra sakerna viktigare... Jag förvånar ofta över min iPad med Apple M4 hur otroligt segt vissa applikationer ändå är på denna snabba krets, men det är inte precis prestanda som har prioriteras i dessa.

C++ språket utvecklas, säkerligen kommer det bli mer minnesäkert. Nu var det länge sedan jag kodade C++, men jag ville minnas att om man bara struntade i prestandan och hur koden såg ut, så gick de mesta problem lösa utan använda pekare och göra det bra minnessäkert.

Alla språk går att använda för att lösa majoriteten av problemen. HTML är har nog monopol på sitt område.

Men just angående om minnessäkerheten kring C++. Är det någon som har hört något mera om statusen för just C++?
C++ verkar vara på uppgång hos TIOBE. Den hade sin lägsta punkt år 2017 (4.55%) och idag är den på andra plats 10.75%.
Så på något sätt så måste väll C++ har blivit bättre?

Permalänk
Medlem
Skrivet av heretic16:

Valet av C++ kan mycket bygga på flera faktorer.

  • Redan kännedom

  • Jobba i långtidsprojekt

  • Prestanda

  • Tillgänglighet

Enligt mitt tyckte så tror jag inte att det skulle vara ett problem att låta kompilatorn gå igenom C++ språket under kompileringen och varna vid minsta lilla minneslucka. Rätta mig gärna om jag är naiv.

Ok men då är det inte C++ längre.
Liksom ska alla standard bibliotek skrivas om till att vara utan pekare... Igen baggage och andra språk.

Sedan håller jag med att det borde inte vara svårt att skapa ett minnessäkert (och presterande språk)
Skriver själv "minnessäkert" genom att låta alla objekt ligga på interface och låta ARC göra sitt, borde inte vara svårt att kräva det i kompilatorn (och att objekt instanseras vid första referensen)

Permalänk
Medlem

Jag jobbar med C++ som primärt arbetsspråk sedan snart 20 år. Det har utvecklats massor och man kan skriva väldigt bra och ganska säker kod med det idag. Men det kräver hög disciplin och ganska hög kunskap av den som skriver koden. Dessutom har det som så mycket annat utvecklats genom att man lagt till saker men inte orkat rensat bort särskilt mycket vilket gör att man kan göra samma saker på många olika sätt vilket enligt mig inte är önskvärt i ett programmeringsspråk. Jag älskar C++, särskilt när det är skrivet på ett sätt som jag gillar, eller i alla fall hyfsat vettigt och enligt "Keep it simple" principen. Men jag skulle inte säga att det har framtiden för sig.

Håller på och försöker lära mig Rust för det har väldigt många fördelar gentemot C++ för framtiden och som du skriver TS så önskar stora spelare som MS och USA att man ska gå mot säkrare språk som Rust.

Dock ska det sägas att t.ex. Cobol och liknande språk har ännu mindre framtiden för sig men arbetsmarknaden är bra för de få som är bra på det för det finns så mycket legacy system men väldigt få nya utvecklare vill lära sig det. Det kommer att finnas enorma mängder C++ legacy i decennier framöver så om du inte planerar att jobba efter 2100 så kan du nog försörja dig hela vägen till pensionen på C++ kunskap...

Permalänk
99:e percentilen
Skrivet av heretic16:

C och C++ pekas ut som språk som ska undvikas för nya projekt, av Microsoft, USA's regering och Rust-folket.

Källa på det? (Ja, jag vet att det är sant. Källa bör ändå inkluderas.)

Citat:

Men samtidigt så säger C++ folket att det går programmera minnessäkert med C++ om man använder rätt funktioner.

Källa på det?

Citat:

Även deras C++ ledare Bjarne Stroustrup säger att C++ är på väg att bli ett minnessäkert språk.

Källa på det?

Skrivet av heretic16:

Enligt mitt tyckte så tror jag inte att det skulle vara ett problem att låta kompilatorn gå igenom C++ språket under kompileringen och varna vid minsta lilla minneslucka. Rätta mig gärna om jag är naiv.

Vi (@Erik_T, @mpat, @Yoshman med flera) har ju redan gjort det till leda.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Känns som att det kommer ta ett tag innan det finns standarder för säker mjukvaruutveckling med Rust, så de branscher som utvecklar säkerhetskritiskmjukvara lär inte använda Rust på ett tag. Räcker inte med att det finns språk som är bättre om man inte kan sälja sin produkt med det.

Visa signatur

Every time I see some piece of medical research saying that caffeine is good for you, I high-five myself. Because I'm going to live forever.
~ Linus Torvalds (2010-08-03)

Permalänk
Medlem
Skrivet av mechersmith:

Känns som att det kommer ta ett tag innan det finns standarder för säker mjukvaruutveckling med Rust, så de branscher som utvecklar säkerhetskritiskmjukvara lär inte använda Rust på ett tag. Räcker inte med att det finns språk som är bättre om man inte kan sälja sin produkt med det.

“Simply writing any new code in Rust reduces the number of new vulnerabilities and over time can lead to a reduction in the number of outstanding vulnerabilities,”

https://www.securityweek.com/google-pushes-rust-in-legacy-fir...

Permalänk
Hedersmedlem
Skrivet av heretic16:

Enligt mitt tyckte så tror jag inte att det skulle vara ett problem att låta kompilatorn gå igenom C++ språket under kompileringen och varna vid minsta lilla minneslucka. Rätta mig gärna om jag är naiv.

Tyvärr är det oerhört komplicerat, givet den grad av frihet c++ erbjuder, att avgöra vad som faktiskt orsakar problem. Bakåtkompatibilitet är ju också oerhört viktigt i c++, och man vill ju inte ha falsklarm för kod som faktiskt är korrekt även om den råkar använda ”osäkra” konstruktioner.

Skrivet av heretic16:

Men man har hört mycket negativt om C++ t.ex. ovan, att språket är ej minnessäkert.

Det skrivs ju mycket, men jag vet inte om detta är något som har blivit särskilt mycket akutare inom c++-världen. Det är ju knappast några nyheter.

Skrivet av lillaankan_i_dammen:

Nu var det länge sedan jag kodade C++, men jag ville minnas att om man bara struntade i prestandan och hur koden såg ut, så gick de mesta problem lösa utan använda pekare och göra det bra minnessäkert.

Ofta behöver man väl knappt offra prestanda heller? Numera behöver det till exempel inte vara ett problem att returnera vektorer från funktioner.

Skrivet av SweDragon:

Dessutom har det som så mycket annat utvecklats genom att man lagt till saker men inte orkat rensat bort särskilt mycket vilket gör att man kan göra samma saker på många olika sätt vilket enligt mig inte är önskvärt i ett programmeringsspråk.

Problemet med att rensa är ju att gammal kod skulle sluta fungera, och det är inte ett alternativ i c++.

Permalänk
Skrivet av Sinery:

Ok men då är det inte C++ längre.
Liksom ska alla standard bibliotek skrivas om till att vara utan pekare... Igen baggage och andra språk.

Sedan håller jag med att det borde inte vara svårt att skapa ett minnessäkert (och presterande språk)
Skriver själv "minnessäkert" genom att låta alla objekt ligga på interface och låta ARC göra sitt, borde inte vara svårt att kräva det i kompilatorn (och att objekt instanseras vid första referensen)

Vi säger att kompilatorn erbjuder en flagga som säger att om denna flagga är aktiverad, då kommer koden som användaren ha skrivit, att bli granskad. Inte koden som andra har skrivit.

Jag tror detta skulle göra så att kompilatorn för C++ gör så att jag som användare, inte kan göra fel, trots att kod som jag har importerat via andra bibliotek, granskas inte.

Permalänk
Datavetare

Bjarne i all ära, har väldigt stor respekt för vad han bidragit med kring programutveckling. Ändå har han fel här.

Punkt #1: bara titta på statistiken. Över 50 % av alla buggar som görs i C++ är sådana som de "säkra" språket alla skulle hindra. Det Bjarne i praktiken säger här är: det går ju att göra rätt, så gör rätt... Modern C++ gör det lättare att göra rätt, men absolut inte omöjligt att göra fel.

Punkt #2: även om någon framtida version av C++ skulle lösa alla problemen med minnessäkerhet måste man ställa sig frågan "varför används ens C++ idag?". Svaret är att så mycket existerande kod är redan skriven i C och C++, C++ har lysande kompatibilitet med detta.

Om kravet är att all kod ska skrivas om i "modern och säker C++" kan man ju lika gärna skriva om det i ett annat språk. För finns definitivt kvar en rad vårtor i C++.

Vill säga att C++ ligger mig varmt om hjärtat. Även om jag hade lyckats skriva lite saker i BASIC och assembler tidigare, var det med C++ jag verkligen lärde mig programmera. Har undervisat i C++, att vara vikarie på gymnasium var väldigt bra extraknäck när man var student. Och varit med och utvecklat C++11/14 standardbiblioteket för VxWorks.

Men är ändå bara glad att jag till nästan 100 % helt har kunna lämna detta språk bakom mig

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Bjarne i all ära, har väldigt stor respekt för vad han bidragit med kring programutveckling. Ändå har han fel här.

Punkt #1: bara titta på statistiken. Över 50 % av alla buggar som görs i C++ är sådana som de "säkra" språket alla skulle hindra. Det Bjarne i praktiken säger här är: det går ju att göra rätt, så gör rätt... Modern C++ gör det lättare att göra rätt, men absolut inte omöjligt att göra fel.

Punkt #2: även om någon framtida version av C++ skulle lösa alla problemen med minnessäkerhet måste man ställa sig frågan "varför används ens C++ idag?". Svaret är att så mycket existerande kod är redan skriven i C och C++, C++ har lysande kompatibilitet med detta.

Om kravet är att all kod ska skrivas om i "modern och säker C++" kan man ju lika gärna skriva om det i ett annat språk. För finns definitivt kvar en rad vårtor i C++.

Vill säga att C++ ligger mig varmt om hjärtat. Även om jag hade lyckats skriva lite saker i BASIC och assembler tidigare, var det med C++ jag verkligen lärde mig programmera. Har undervisat i C++, att vara vikarie på gymnasium var väldigt bra extraknäck när man var student. Och varit med och utvecklat C++11/14 standardbiblioteket för VxWorks.

Men är ändå bara glad att jag till nästan 100 % helt har kunna lämna detta språk bakom mig

Kan du ge ett exempel på en minnesbugg som är väldigt vanligt förekommen i C++.
Det enda jag kan tänka mig är att man skriver till pekare som inte har fått en adress allokerad, eller man glömmer frigöra minnet. Men frigöra minnet känns lite som gamla C++. Idag så frigör C++ minnet igenom att använda smarta pekare. Istället för vanlig array, så kan man använda vector, eller std:array.

Permalänk
Medlem
Skrivet av heretic16:

Kan du ge ett exempel på en minnesbugg som är väldigt vanligt förekommen i C++.
Det enda jag kan tänka mig är att man skriver till pekare som inte har fått en adress allokerad, eller man glömmer frigöra minnet. Men frigöra minnet känns lite som gamla C++. Idag så frigör C++ minnet igenom att använda smarta pekare. Istället för vanlig array, så kan man använda vector, eller std:array.

C++ använder inte smarta pekare - det är programmeraren som måste komma ihåg att använda sådana. Vilket kan vara besvärligt om man jobbar med något program som ursprungligen skrevs innan smarta pekare började bli populära. Vilket antagligen är majoriten av C++ program.

C++ är inte bara dess nya features. All gammal skit som finns kvar i språket är också C++, och så länge det är en del av språket måste man ta hänsyn till att det är en del av språket som kan användas.
Att bara vifta med handen och hänvisa till smarta pekare hjälper inte så länge det inte är 100% obligatoriskt att använda smarta pekare istället för icke-smarta pekare.

C++ förespråkare brukar alltför ofta fokusera på skrivandet av nya program i senaste versionen av C++. Vilket är ett obetydligt specialfall.
Majoriteten av programmerande är underhåll av existerande program. Oftast skrivna i en äldre version av valt programmeringsspråk, av många olika människor med varierande skicklighet och kunskap.

Permalänk
Medlem
Skrivet av Elgot:

Problemet med att rensa är ju att gammal kod skulle sluta fungera, och det är inte ett alternativ i c++.

Man skulle absolut gradvis kunna deprecatea och sedan förbjuda konstruktioner i C++. Det skulle kräva viss successiv omarbetning av existerande kodbaser men det gör vi på mitt jobb idag genom att successivt öka graden av "treat warning as error" och omarbeta gammal kod så att det bygger och kör med allt striktare regler. Jag tror inte att vi är särskilt unika.

Att det är svårt politiskt är en sak men det skulle vara klart praktiskt genomförbart att säga att t.ex. C++27 kompilatorer och framåt ska förbjuda nakna pekare till förmån för referenser eller smartpekare och låta versioner upp till dess varna för sådana konstruktioner. Kodbaser som inte vill uppdatera får stanna på c++25 eller whatever.

Permalänk
Hedersmedlem
Skrivet av SweDragon:

Man skulle absolut gradvis kunna deprecatea och sedan förbjuda konstruktioner i C++. Det skulle kräva viss successiv omarbetning av existerande kodbaser men det gör vi på mitt jobb idag genom att successivt öka graden av "treat warning as error" och omarbeta gammal kod så att det bygger och kör med allt striktare regler. Jag tror inte att vi är särskilt unika.

Att det är svårt politiskt är en sak men det skulle vara klart praktiskt genomförbart att säga att t.ex. C++27 kompilatorer och framåt ska förbjuda nakna pekare till förmån för referenser eller smartpekare och låta versioner upp till dess varna för sådana konstruktioner. Kodbaser som inte vill uppdatera får stanna på c++25 eller whatever.

Det är klart att man kan, men det känns väl helt främmande för hur c++ fungerar idag? Jag är skeptisk till att det finns något större intresse av att gå åt det hållet med hela språket.

Permalänk
Skrivet av Erik_T:

C++ använder inte smarta pekare - det är programmeraren som måste komma ihåg att använda sådana. Vilket kan vara besvärligt om man jobbar med något program som ursprungligen skrevs innan smarta pekare började bli populära. Vilket antagligen är majoriten av C++ program.

C++ är inte bara dess nya features. All gammal skit som finns kvar i språket är också C++, och så länge det är en del av språket måste man ta hänsyn till att det är en del av språket som kan användas.
Att bara vifta med handen och hänvisa till smarta pekare hjälper inte så länge det inte är 100% obligatoriskt att använda smarta pekare istället för icke-smarta pekare.

C++ förespråkare brukar alltför ofta fokusera på skrivandet av nya program i senaste versionen av C++. Vilket är ett obetydligt specialfall.
Majoriteten av programmerande är underhåll av existerande program. Oftast skrivna i en äldre version av valt programmeringsspråk, av många olika människor med varierande skicklighet och kunskap.

Det finns alltid gamla funktioner i alla språk. Det blir så när språket är gammalt.

Men om fler och fler väljer att skriva sina projekt i ny standard av C++, så måste detta betyda en förbättring istället för en försämring?

Jag förstår att vissa projekt är bunden till en viss äldre standard. Jag skulle tolka projektet som oseriöst och okunnigt då.

Permalänk

Men hur som helst. Är det någon som har information om hur det går med minnessäkerheten för C++?

Permalänk
Medlem
Skrivet av heretic16:

Men om fler och fler väljer att skriva sina projekt i ny standard av C++, så måste detta betyda en förbättring istället för en försämring?

Måste och måste. Det förutsätter ju att den nyaste versionen av C++ är bättre än de äldre, vilket inte är så där alldeles självklart.
Och sen beror det på vad alternativen är. Om ett alternativ är att skriva i något annat språk än C++, så är det nog oftast en större förbättring.

Citat:

Jag förstår att vissa projekt är bunden till en viss äldre standard. Jag skulle tolka projektet som oseriöst och okunnigt då.

Snarare så att många projekt har en stor mängd kod skriven enligt äldre standard.
Att skriva om den koden enligt nyare riktlinjer skulle kräva mer jobb och tid än det antagligen är värt. Så man får leva med gammal kod i projektet.

Och sen finns det ju fall där man är tvungen att hålla sig till en äldre språkstandard för att det inte finns någon uppdaterad kompilator för den plattformen man jobbar mot.

I ingendera fallet behöver projektet eller de som jobbar med det vara oseriösa eller okunniga.

Permalänk
Datavetare
Skrivet av heretic16:

Kan du ge ett exempel på en minnesbugg som är väldigt vanligt förekommen i C++.
Det enda jag kan tänka mig är att man skriver till pekare som inte har fått en adress allokerad, eller man glömmer frigöra minnet. Men frigöra minnet känns lite som gamla C++. Idag så frigör C++ minnet igenom att använda smarta pekare. Istället för vanlig array, så kan man använda vector, eller std:array.

int foo(std::vector<int> xs) { auto index = compute_index(...); return xs[index]; // out-of-bounds-access }

int add(int a, int b) { return a + b; // undefined behavior if overflows }

Där är två exempel där det första är i grunden överlägset vanligaste problemet i C och C++ program.

Det andra är inte helt sällan orsaken till att man hamnar i det första, även om det mer handlar om att någon beräkning blev negativa eller slog runt på ett sätt som man inte tänkt sig. Själva UB-delen är i sig ett mindre problem i praktiken då resultatet kommer bli "rätt" vid overflow med alla populära kompilatorer på alla populära CPU-mikroarkitekturer.

Rust har inget av problemen. Det andra då beteendet är väldefinerat där. Mer viktig går det inte att göra första buggen med mindre än att använda sig av "unsafe" context.

Den huvudsakliga skillnaden mellan C++ och egentligen alla andra moderna programspråk är att C++ är "unsafe by default" medan alla andra är "safe by default".

Vare sig C eller C++ kan i praktiken ändra just denna default. Gör man det kommer de inte längre vara bakåtkompatibla och då är de poänglösa.

Huvudanledningen att använda C och C++ var väldigt länge att de gav stora möjligheter att skriva väldigt snabb kod. Här har det egentligen bara en direkt konkurrent, Rust. Men Rust är verkligen lika snabbt, faktiskt snabbare i vissa lägen p.g.a. vettigare aliasing hantering.

Sen är extremprestanda kritiskt där det behövs. Men finns väldigt många fall där det i praktiken inte spelar någon roll i själva applikationen. Att Python av alla språk börjar bli populärt i mikrokontrollers visar detta. De kritiska delarna som hanterar interrupt och liknande är i C eller C++, men väldigt många IoT applikationer går utmärkt att köra med Micropython för de behöver bara göra en rätt enkel sak i oändlighet.

Personligen fördrar jag dock lång mer TinyGo eller Rust över Micropython.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av heretic16:

Men hur som helst. Är det någon som har information om hur det går med minnessäkerheten för C++?

Detta är en väldigt bra sammanfattning av "hur det går"

Detta är från en lista med de 25 vanligaste orsakerna till sårbarheter i programvara. Gulmarkerade är de som i praktiken är unika för C och C++, men är "by default" inte möjliga att utnyttja i princip alla moderna programspråk.

Note "utnyttja". Null-pointer-exception går att få i de flesta språk (även det går att undvika i Rust, i.e. det kommer inte kompilera). Men det leder inte till säkerhetshål utan program kraschar kontrollerat.

Så grundinställningen idag bör vara att C och C++ aldrig ska vara förhandsvalet för något nytt projekt. Men man måste också vara pragmatisk, så om det inte är rimligt att använda något annat ska man naturligtvis ändå välja C++. Man måste då också vara medveten om att man i praktiken hela tiden går i ett minfält med osäkrade vapen och agera därefter.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av n0kturnal:

“Simply writing any new code in Rust reduces the number of new vulnerabilities and over time can lead to a reduction in the number of outstanding vulnerabilities,”

https://www.securityweek.com/google-pushes-rust-in-legacy-fir...

Artikeln handlar om android och inte säkerhetskritiskmjukvara, det jag pratar om är alltså metodiken vid utvecklingen som måste finnas på plats för det programmeringsspråk man väljer för produkter som klassas som säkerhetskritiska. Det handlar alltså om utveckling av mjukvara för tex vapen, flygplan, bilar, infrastruktur, etc.

Visa signatur

Every time I see some piece of medical research saying that caffeine is good for you, I high-five myself. Because I'm going to live forever.
~ Linus Torvalds (2010-08-03)

Permalänk
Medlem
Skrivet av Elgot:

Det är klart att man kan, men det känns väl helt främmande för hur c++ fungerar idag? Jag är skeptisk till att det finns något större intresse av att gå åt det hållet med hela språket.

Det är ett ganska extremt exempel men om man vill gå mot minnessäkring eller något annat modernare paradigm (t.ex. const som default och ett keyword för mutable som Rust har är ett annat exempel) så skulle man kunna göra det. Det skulle förmodligen krävas en hel del, men jag menar bara att det skulle vara tekniskt möjligt att modernisera C++ även om det förmodligen inte finns intresse bland tillräckligt många inblandade för att driva det ditåt. Enklare att bara gå över till ett nytt språk. Väljer man något som Rust kan man ju fortsätta köra sin äldre kod som binärkompatibla moduler så länge det behövs också.

Permalänk
Datavetare
Skrivet av mechersmith:

Artikeln handlar om android och inte säkerhetskritiskmjukvara, det jag pratar om är alltså metodiken vid utvecklingen som måste finnas på plats för det programmeringsspråk man väljer för produkter som klassas som säkerhetskritiska. Det handlar alltså om utveckling av mjukvara för tex vapen, flygplan, bilar, infrastruktur, etc.

Du menar alltså säkerhet som i "safety", inte "secure". Lite lurigt med svenska här då vår namngivning inte särskiljer på "skydda enheten från omvärlden" (secure) och "skydda omvärlden från enheten" (safety).

Avundas definitivt inte de som behöver få till så att en C++ kompilator går att använda ihop med DO-178C (aviation) eller ISO 26262 (automotive).

Har själv bara jobbat att certifiera mot DO-178C level A med ISO-C89. Även om statistiken visar att det faktiskt går att göra "säker" C kod skulle jag inte hävda att detta bevisar att C är något man bör använda i normalfallet för att bygga "säker" kod.

Prislappen för att nå denna typ av säkerhet är astronomisk. Uppskattningen jag blev berättad var >$100 per färdigcertifierad C-rad.

Positiva: det är tekniskt möjligt.
Negativa: det är bara realistiskt om man verkligen måste p.g.a. prislapp. Och har aldrig varit med om något så "tråkigt" att jobba med som utvecklare som detta, enda ljuspunkten är "har i alla fall gjort det en gång i livet"..

Även om man inte når nivån som krävs i dessa standarder med "moderna programmeringsspråk" så är deras primära värde i att de lägger lägstanivån långt över lägstanivån hos C eller C++. Och för majoriteten av all programvara är detta långt viktigare.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Du menar alltså säkerhet som i "safety", inte "secure". Lite lurigt med svenska här då vår namngivning inte särskiljer på "skydda enheten från omvärlden" (secure) och "skydda omvärlden från enheten" (safety).

Avundas definitivt inte de som behöver få till så att en C++ kompilator går att använda ihop med DO-178C (aviation) eller ISO 26262 (automotive).

Har själv bara jobbat att certifiera mot DO-178C level A med ISO-C89. Även om statistiken visar att det faktiskt går att göra "säker" C kod skulle jag inte hävda att detta bevisar att C är något man bör använda i normalfallet för att bygga "säker" kod.

Prislappen för att nå denna typ av säkerhet är astronomisk. Uppskattningen jag blev berättad var >$100 per färdigcertifierad C-rad.

Positiva: det är tekniskt möjligt.
Negativa: det är bara realistiskt om man verkligen måste p.g.a. prislapp. Och har aldrig varit med om något så "tråkigt" att jobba med som utvecklare som detta, enda ljuspunkten är "har i alla fall gjort det en gång i livet"..

Även om man inte når nivån som krävs i dessa standarder med "moderna programmeringsspråk" så är deras primära värde i att de lägger lägstanivån långt över lägstanivån hos C eller C++. Och för majoriteten av all programvara är detta långt viktigare.

Precis, kanske borde refererat till den engelska motsvarigheten.

AUTOSAR (bilindustrin) verkar även arbeta på en metodik för att använda just Rust, men som med alla dessa standarder så tar de tid att framställa och produkterna som implementerar de tar lång tid att utveckla. Beslutet på språk görs även i början av projekten och ofta vill man återanvända befintlig kodbas som redan uppfyller de hårda kraven, det som tar tid är trots allt inte att skriva koden utan alla dokument, tester, analyser och kravlänkning.

Visa signatur

Every time I see some piece of medical research saying that caffeine is good for you, I high-five myself. Because I'm going to live forever.
~ Linus Torvalds (2010-08-03)