Permalänk
Medlem
Skrivet av heretic16:

Är det inte bara ha någon modul som granskar koden? Jag menar, om folk lyckas skapa robotar som kan ha känslor, så kan folk säkerligen implementera någon MISRA C check-modul i en valfri IDE?

För det första så har folk fortfarande inte lyckats skapa robotar som har känslor - bara robotar som kan låtsas ha det.

Som jag sade tidigare - om du nu tror att det är så enkelt, varför gör du det inte själv? Försök gärna - om inte annat kommer du nog att lära dig en del om hur kompilatorer fungerar.

Permalänk
Medlem
Skrivet av Erik_T:

För det första så har folk fortfarande inte lyckats skapa robotar som har känslor - bara robotar som kan låtsas ha det.

Som jag sade tidigare - om du nu tror att det är så enkelt, varför gör du det inte själv? Försök gärna - om inte annat kommer du nog att lära dig en del om hur kompilatorer fungerar.

Jag håller med @Erik_T.

Jag tror att man lider av en gnutta Dunning-Kruger i fall man underskattar komplexiteten hos exempelvis GCC eller Clang. Båda projekten är open-source och implementerade i C och C++ så det är bara att skicka patchar upstream.

Permalänk
Skrivet av orp:

Jag håller med @Erik_T. Jag tror att man lider av en gnutta Dunning-Kruger i fall man underskattar komplexiteten hos exempelvis GCC eller Clang. Speciellt om man tidigare inte känt till grundläggande begrepp som "undefined behavior" och "dynamic memory allocation".

Det är ingen dunning-kreuger effekt om man ställer en nyfiken fråga.

Permalänk
Skrivet av orp:

Om du ska kolla returvärdet från scanf() genererar det mer assembly? Självklart kommer en extra error check generera mer maskinkod. Jag försöker förstå vad din poäng är eller om det är någon märklig "gotcha". Det går att köra try_read!() utan unwrap_or_default() ifall du nu fiskar efter det.

Jag känner att tråden har derail:at och att det mer handlar om att du inte gillar Rust och du nu känner behov av att rättfärdiga för omvärlden att du ska få fortsätta att skriva C och C++.

Du använder performance som ständigt argument men som jag tidigare nämnt så tror jag inte att du kommer märka skillnad i prestanda mellan C, C++, Rust, Zig, Carbon, med flera. Det är OK att du inte gillar Rust och ingen tvingar dig att skriva det.

Jag bara kollar. Vad jag har fått läsa är att Rust ska vara snabbare än C och C++. Men jag undrar då till vilken kostnad. För mig är denna forskning väldigt viktig för att jag ska planera vad jag bör investera min tid i framtiden. Som jag har fått reda på nu så är Rust = Minnessäkerhet. Men kostar det något?

Nej, jag är inte emot Rust. Jag försöker bara forska i språket. Det är mycket hybris om just "C++ killers" och jag är väldigt nyfiken på dom. Nu så ska det tydligen vara en ny "C++ killer" ute vid namn Zig och snart kommer Carbon ut som ska tydligen vara en "Rust killer". Alla dessa "killer"-språk tycker jag är intressanta vad dom har att erbjuda.

Permalänk
Medlem
Skrivet av heretic16:

Det är ingen dunning-kreuger effekt om man ställer en nyfiken fråga.

Det är nog specifikt "är det inte bara" som väcker den känslan:

Skrivet av heretic16:

Är det inte bara ha någon modul som granskar koden? Jag menar, om folk lyckas skapa robotar som kan ha känslor, så kan folk säkerligen implementera någon MISRA C check-modul i en valfri IDE?

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av heretic16:

Det är ingen dunning-kreuger effekt om man ställer en nyfiken fråga.

Skrivet av heretic16:

Klart det borde vara enkelt?
Om andra språk har det, varför har inte C och C++ det också?
Man behöver ju inte förändra syntaxen på koden.

Det är ju inte enbart en nyfiken fråga när någon informerat dig om att det inte är så lätt att validera och du svarar med att "klart det border vara enkelt?". Om detta är stora problem med språken och exempelvis C har funnits i över 50 år och antagligen används av 100 000-tals utvecklare, varför är det inte åtgärdat problemen om det nu är så enkelt?

Permalänk
Skrivet av orp:

Det är ju inte enbart en nyfiken fråga när någon informerat dig om att det inte är så lätt att validera och du svarar med att "klart det border vara enkelt?". Om detta är stora problem med språken och exempelvis C har funnits i över 50 år och antagligen används av 100 000-tals utvecklare, varför är det inte åtgärdat problemen om det nu är så enkelt?

Vad är det som hindrar utvecklare att låta en IDE analysera koden?
Jag menar, det finns Valgrind idag som analyserar. Jag har själv använt den och den säger bland annat åt vad för fel det är och vart felet är.

Varför inte implementera detta i, antingen i en kompilator eller en IDE som standard?

Permalänk
Medlem
Skrivet av heretic16:

Vad jag har fått läsa är att Rust ska vara snabbare än C och C++

Nej det är inte snabbare än C och det är väl på ungefär samma hastighet som C++ men alla sådana här mätningar ska man ta med en nypa salt eftersom de oftast inte kan appliceras på ditt use-case.

Skrivet av heretic16:

För mig är denna forskning väldigt viktig för att jag ska planera vad jag bör investera min tid i framtiden.

Om du vill framtidssäkra dig så är det bästa att välja en portfolio med språk som löser olika typer av problem olika lätt. Språk är enbart en liten del det viktigaste är att ha en förmåga att anpassa sig.

Skrivet av heretic16:

Jag försöker bara forska i språket.

Nej, det gör du inte. Ditt första inlägg är kritiserande och inte utforskande. Utöver detta när folk bemöter din kritik så kommer du med omogna inlägg som:

Skrivet av heretic16:

Så vad väntar företagen på då? Kasta ut alla språk då och ha bara kvar Rust?
Rust verkar ju ha löst allt som ingen har löst?

Där du kommer med påstående som ingen gjort om att Rust skulle lösa alla problem. Detta är än en gång ett bevis på att det inte är en utforskande mentalitet.

Skrivet av heretic16:

Det är mycket hybris om just "C++ killers" och jag är väldigt nyfiken på dom.

Jag tror det är här skon klämmer. Du har läst rubriker om att X skulle vara en C- eller C++-killer. Jag skriver både C och Rust och jag gillar båda språken och jag anser _inte_ att stora etablerade projekt ska skrivas om från exempelvis C.

Skrivet av heretic16:

Nu så ska det tydligen vara en ny "C++ killer" ute vid namn Zig och snart kommer Carbon ut som ska tydligen vara en "Rust killer". Alla dessa "killer"-språk tycker jag är intressanta vad dom har att erbjuda.

Zig är ett alternativ till C och Rust. Du kan transpilera(transpiler/transcompiler) C-kod till Zig och vise versa. Carbon är introducerad som alternativ till C++ och erbjuder inline-stöd för C++ dvs den har inget med Rust att göra.

Permalänk
Medlem
Skrivet av heretic16:

Vad är det som hindrar utvecklare att låta en IDE analysera koden?
Jag menar, det finns Valgrind idag som analyserar. Jag har själv använt den och den säger bland annat åt vad för fel det är och vart felet är.

Varför inte implementera detta i, antingen i en kompilator eller en IDE som standard?

Vad får dig att tro att det inte gjorts?
Problemet är att analysverktyg som Valgrind, oavsett hur avancerade de är, inte kan upptäcka alla fel.
En viktig skillnad mellan Rust och C är att det är fler typer av fel i Rust som är möjliga att upptäcka med statisk analys, och som en kompilator för Rust skall upptäcka.

Permalänk
Medlem
Skrivet av heretic16:

Vad är det som hindrar utvecklare att låta en IDE analysera koden?
Jag menar, det finns Valgrind idag som analyserar. Jag har själv använt den och den säger bland annat åt vad för fel det är och vart felet är.

Varför inte implementera detta i, antingen i en kompilator eller en IDE som standard?

Jag känner till valgrind och address sanitizer osv. Hur tror du valgrind fungerar?

Permalänk
Medlem
Skrivet av heretic16:

Vad är det som hindrar utvecklare att låta en IDE analysera koden?
Jag menar, det finns Valgrind idag som analyserar. Jag har själv använt den och den säger bland annat åt vad för fel det är och vart felet är.

Varför inte implementera detta i, antingen i en kompilator eller en IDE som standard?

Förutom att Valgrind (och liknande lösningar såsom PurifyPlus) inte ser alla fel så är det dessutom ett verktyg som körs under runtime, så det är inget du kan använda när du skriver din kod. Du måste även se till att provocera fram felindexeringen eller hoppsa att den alltid sker, annars säger inte Valgrind något.

Det är klart att ifall du skapar ett jätteförenklat exempel med hårdkodade index så borde en smart kompilator kunna varna dig för det. Men det är ju inte sådana småfel som erfarna utvecklare fastnar i timtal på utan det är ju just när indexeringen/storleken är dynamisk.

Du kan inte stoppa felindexering med hjälp av en smart IDE. Som flera skrivit tidigare så finns det inte tillräcklig information för att avgöra det.

Permalänk
99:e percentilen
Skrivet av heretic16:

Fast min IDE kan varna mig om jag har någon variabel som är odefinierad.

Skrivet av heretic16:

Men enligt mig så borde väll en IDE kunna avgöra om man överindexerar på C och C++?

Skrivet av heretic16:

Är det inte bara ha någon modul som granskar koden? Jag menar, om folk lyckas skapa robotar som kan ha känslor, så kan folk säkerligen implementera någon MISRA C check-modul i en valfri IDE?

Skrivet av heretic16:

Vad är det som hindrar utvecklare att låta en IDE analysera koden? […]

Varför inte implementera detta i, antingen i en kompilator eller en IDE som standard?

Förutom alla andra missförstånd, felslut och bakvända resonemang* du ger uttryck för som redan pekats ut gång på gång av andra verkar du helt ha missförstått vad en IDE är.

  • En IDE är inte ett orakel. Den förkrossande majoriteten av all information du får i en typisk IDE kommer från kompilatorn. I den mån en IDE (eller ett tillägg till den) tillhandahåller mer information än kompilatorn gör den det i regel heuristiskt.

  • En IDE är inte auktoritativ. Andra utvecklare i samma projekt sitter i allmänhet med en helt annan miljö, och du kan i praktiken inte ens dra nytta av en IDE i CI. Det enda som faktiskt räknas är vad kompilatorn säger.

* Det genomgående temat i dina inlägg i tråden låter ungefär så här:

  1. Du: "[C och C++] är bökigt och omständigt och jag måste ha kontroll på allt. Minsta lilla fel på indexeringen och ALLT blir fel. Det kan ta timmar att felsöka då jag får inget fel om jag överindexerar. […] Helst vill jag få förvarning [om null pointer exceptions] innan jag ens debuggar koden. […] Jag har mycket problem med överindexering hos C […]. Så det tar tid för mig att faktiskt programmera. Jag har stort behov av någon som kan ge mig en varning på […]. […] Att ha en gnällig kompilator skulle jag vilja ha när jag programmerar C."

  2. Andra: "Rust löser de problemen du har."

  3. Du: "Jag har aldrig kört Rust, bara C och C++. […] Personligen är jag lite skeptisk till Rust. […] Språket attraherar folk som ofta kommer från webbutvecklingssidan(vad jag har sett). […] Jag ogillar att man använder massa tecken. […] Jag märker ingen skillnad mellan Python och MATLAB [så prestandaskillnaden mellan Rust och C är alltså jätteviktig för mig]. […] Nej, det är inte skoj med flera språkalternativ - Det är religion. […] Borde inte [egenskaper som går tvärtemot allt som C står för] vara enkelt fixat hos dom som utvecklar C? Jag menar, dom behöver ju inte röra bakåtkompatibiliteten? Det är väll bara lägga till en funktion som granskar koden när man kör den?"

Som tidigare nämnt: om du har tid och möjlighet att skriva en kompilator – eller bara en typcheckare – för ett litet, påhittat leksaksspråk, kan jag varmt rekommendera det. Det är extremt lärorikt och ögonöppnande! När du har lärt dig grunderna kan du göra ett försök att utöka GCC eller Clang med statiska garantier motsvarande Rusts. Lyckas du kommer du göra miljoner utvecklare världen över evigt tacksamma.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Skrivet av orp:

Nej det är inte snabbare än C och det är väl på ungefär samma hastighet som C++ men alla sådana här mätningar ska man ta med en nypa salt eftersom de oftast inte kan appliceras på ditt use-case.

Varför är det så som hävdar det?
Ja, jag tar dessa mätningar med en nypa salt, men det måste väll ligga någon sanning bakom varför vissa mätningar så är det Rust som är snabbare?

Citat:

Om du vill framtidssäkra dig så är det bästa att välja en portfolio med språk som löser olika typer av problem olika lätt. Språk är enbart en liten del det viktigaste är att ha en förmåga att anpassa sig.

Någonstans måste jag börja.

Citat:

Nej, det gör du inte. Ditt första inlägg är kritiserande och inte utforskande. Utöver detta när folk bemöter din kritik så kommer du med omogna inlägg som:

Du tolkar fel. Jag är mycket nyfiken att diskutera olika teknologier.
Nu när Microsoft har sagt att dom väljer Rust framför C och C++ när nya icke GC-projekt ska byggas. Då drar jag slutsatsen att Rust är ett bättre språk helt enkelt.

Citat:

Där du kommer med påstående som ingen gjort om att Rust skulle lösa alla problem. Detta är än en gång ett bevis på att det inte är en utforskande mentalitet.

Jag har inte fått bevisat vad Rust inte kan. Som jag har hört så verkar Rust kunna allt det C++ kan, plus att Rust har högre säkerhet och snabbheten är antingen likadan eller bättre.

Citat:

Jag tror det är här skon klämmer. Du har läst rubriker om att X skulle vara en C- eller C++-killer. Jag skriver både C och Rust och jag gillar båda språken och jag anser _inte_ att stora etablerade projekt ska skrivas om från exempelvis C.

Ja, jag har läst många rubriker och läst vissa debatter på Reddit där vissa hävdar att Rust är bättre än C++ på alla möjliga sätt. Typ som ett "C++ done right". Ungefär som Kotlin-användare säger att Kotlin är ett "Java done right". Då drar jag slutsatsen att dessa programmeringsspråk är bättre.

Citat:

Zig är ett alternativ till C och Rust. Du kan transpilera(transpiler/transcompiler) C-kod till Zig och vise versa. Carbon är introducerad som alternativ till C++ och erbjuder inline-stöd för C++ dvs den har inget med Rust att göra.

Jo, det vet jag.
Men alla dessa språk som kommer upp som ska göra in princip samma sak som C och C++, måste väll vara bättre trots allt?
Jag menar, du uppfinner inte ett C++ liknande språk, om språket är sämre?

Skrivet av Erik_T:

Vad får dig att tro att det inte gjorts?
Problemet är att analysverktyg som Valgrind, oavsett hur avancerade de är, inte kan upptäcka alla fel.
En viktig skillnad mellan Rust och C är att det är fler typer av fel i Rust som är möjliga att upptäcka med statisk analys, och som en kompilator för Rust skall upptäcka.

Jag kör Microsoft Visual Studio Community och jag har inte sett ett sådant verktyg som kan analysera minnet t.ex. överindexering eller glömde frigöra dynamiskt allokerat minne. Detta skulle jag uppskatta för jag har behov utav sådant, faktiskt väldigt mycket. Jag lägger ned timmar på att få till indexeringen korrekt då jag håller på med machine learning i C. Jag vet...det är tokigt. Men det är sjukt snabbt.

I Linux brukar jag köra Valgrind där jag kollar om jag överindexerar. Detta tycker jag är smidigt. Jag saknar sådant verktyg i MSVSC-IDE:n.

Skrivet av orp:

Jag känner till valgrind och address sanitizer osv. Hur tror du valgrind fungerar?

Den kollar hur mycket allokerat minne jag deklarerar och kollar hur mycket jag förbrukar?

Skrivet av Curik:

Förutom att Valgrind (och liknande lösningar såsom PurifyPlus) inte ser alla fel så är det dessutom ett verktyg som körs under runtime, så det är inget du kan använda när du skriver din kod. Du måste även se till att provocera fram felindexeringen eller hoppsa att den alltid sker, annars säger inte Valgrind något.

Det är klart att ifall du skapar ett jätteförenklat exempel med hårdkodade index så borde en smart kompilator kunna varna dig för det. Men det är ju inte sådana småfel som erfarna utvecklare fastnar i timtal på utan det är ju just när indexeringen/storleken är dynamisk.

Du kan inte stoppa felindexering med hjälp av en smart IDE. Som flera skrivit tidigare så finns det inte tillräcklig information för att avgöra det.

Har du något exempel på sådant verktyg i Microsoft Visual Studio Community?

Skrivet av Alling:

Förutom alla andra missförstånd, felslut och bakvända resonemang* du ger uttryck för som redan pekats ut gång på gång av andra verkar du helt ha missförstått vad en IDE är.

  • En IDE är inte ett orakel. Den förkrossande majoriteten av all information du får i en typisk IDE kommer från kompilatorn. I den mån en IDE (eller ett tillägg till den) tillhandahåller mer information än kompilatorn gör den det i regel heuristiskt.

  • En IDE är inte auktoritativ. Andra utvecklare i samma projekt sitter i allmänhet med en helt annan miljö, och du kan i praktiken inte ens dra nytta av en IDE i CI. Det enda som faktiskt räknas är vad kompilatorn säger.

Jag vet vad en IDE är.

Citat:

* Det genomgående temat i dina inlägg i tråden låter ungefär så här:

  1. Du: "[C och C++] är bökigt och omständigt och jag måste ha kontroll på allt. Minsta lilla fel på indexeringen och ALLT blir fel. Det kan ta timmar att felsöka då jag får inget fel om jag överindexerar. […] Helst vill jag få förvarning [om null pointer exceptions] innan jag ens debuggar koden. […] Jag har mycket problem med överindexering hos C […]. Så det tar tid för mig att faktiskt programmera. Jag har stort behov av någon som kan ge mig en varning på […]. […] Att ha en gnällig kompilator skulle jag vilja ha när jag programmerar C."

  2. Andra: "Rust löser de problemen du har."

  3. Du: "Jag har aldrig kört Rust, bara C och C++. […] Personligen är jag lite skeptisk till Rust. […] Språket attraherar folk som ofta kommer från webbutvecklingssidan(vad jag har sett). […] Jag ogillar att man använder massa tecken. […] Jag märker ingen skillnad mellan Python och MATLAB [så prestandaskillnaden mellan Rust och C är alltså jätteviktig för mig]. […] Nej, det är inte skoj med flera språkalternativ - Det är religion. […] Borde inte [egenskaper som går tvärtemot allt som C står för] vara enkelt fixat hos dom som utvecklar C? Jag menar, dom behöver ju inte röra bakåtkompatibiliteten? Det är väll bara lägga till en funktion som granskar koden när man kör den?"

Du verkar störa dig på att jag undersöker olika fördelar och nackdelar?

Citat:

Som tidigare nämnt: om du har tid och möjlighet att skriva en kompilator – eller bara en typcheckare – för ett litet, påhittat leksaksspråk, kan jag varmt rekommendera det. Det är extremt lärorikt och ögonöppnande! När du har lärt dig grunderna kan du göra ett försök att utöka GCC eller Clang med statiska garantier motsvarande Rusts. Lyckas du kommer du göra miljoner utvecklare världen över evigt tacksamma.

Nej, jag har inte sådan kunskap. Jag tänkte bara att det borde vara möjligt idag, med tanke på att det är möjligt i alla andra språk? Jag menar, man behöver väll inte röra språkets struktur om man t.ex. låter kompilatorn granska koden innan den kompileras?

T.ex. låt oss säga att jag ska kompilera en C kod som överindexerar. Min kompilator kompilerar koden, och sedan granskar min kompilerade applikation med t.ex. Valgrind och säger åt mig att denna kod som jag har skrivit är fel på, och felet är här. För överindexering kan Valgrind faktiskt känna igen.

Permalänk
Medlem
Skrivet av heretic16:

Nej, jag har inte sådan kunskap.

Nej, det är väldigt uppenbart att du inte har kunskap på området.

Citat:

Jag tänkte bara att det borde vara möjligt idag, med tanke på att det är möjligt i alla andra språk? Jag menar, man behöver väll inte röra språkets struktur om man t.ex. låter kompilatorn granska koden innan den kompileras?

T.ex. låt oss säga att jag ska kompilera en C kod som överindexerar. Min kompilator kompilerar koden, och sedan granskar min kompilerade applikation med t.ex. Valgrind och säger åt mig att denna kod som jag har skrivit är fel på, och felet är här. För överindexering kan Valgrind faktiskt känna igen.

Nej, det är inte möjligt i alla andra språk, och jo, man kan behöva röra språkets struktur för att kompilatorn skall kunna upptäcka vissa typer av fel.

Valgrind kan upptäcka vissa fall av överindexering, men inte alla, och den gör detta genom att lägga in extra kontroller runt de flesta minnesåtkomster vilket tenderar att göra program betydligt långsammare. Den typen av kontroll kan inte göras av en kompilator, utan bara genom att köra koden med instrumentering.

Låt oss titta på ett mycket enkelt litet C program:

#include <stdio.h> int main() { int arr[10]; int a; printf("Enter a number:"); scanf("%d", &a); arr[a] = a; printf("%d\n", a); return 0; }

Kommer det här programmet att göra en inkorrekt minnesaccess när det körs?
Det kan varken du eller någon kompilator svara på eftersom det beror på vad man ger den för indata, men vad som kan sägas om koden är att den är osäker då den använder indata utan att kontrollera att den har tillåtna värden.

Permalänk
Medlem

Rust löser inte heller problemet med felaktiga index. Det den gör är att den tar bort odefinierat beteende, och säger typ "om man indexerar 'utanför' arrayen SKA programmet avslutas med ett felmeddelande". Ungefär som Java, C#, Python osv (som dock alltid kastar exceptions i det fallet). Skillnaden mot t ex Java är väl dels att man kan garantera att ett program i Rust är väldefinierat även när det är flera trådar inblandade, och dels att man inte har någon garbage collection.

Det skulle vara "ganska lätt" (eller iaf fullt genomförbart) att göra (singeltrådad) C++ lika väldefinierat som Rust just vad gäller indexering genom att låta kompilatorn generera kod som alltid håller ordning på pekare. Men C++ har en viktig princip att aldrig tvinga på programmeraren någonting som kostar prestanda (förutom möjligtvis exceptions, men i praktiken har ju kompilatorer ofta möjlighet att kompilera utan stöd för det). Vill man ha det finns det gott om andra språk att använda istället.

Något liknande med use-after-free eller double-free, det skulle vara "ganska lätt" att detektera det här vid körning i C++ på bekostnad av prestanda. Men i Rust och t ex Java, C#, Python är det omöjligt att göra de felen. I Rust för att språket är byggt från grunden för att hålla koll på livslängder av objekt, vilket kan göra det väldigt frustrerande att använda men möjliggör för kompilatorn att verifiera redan vid kompileringen. I de andra språken för att man använder garbage collection istället för free. I C++ är det omöjligt i det generella fallet.

Då kan man fråga sig VARFÖR det är omöjligt? Kan inte någon smart person komma på något sätt? Och svaret är NEJ. Det finns teoretiska begränsningar för analys av program. Man kan t ex inte konstruera en kompilator (eller IDE-plugin eller whatever) som tar reda på om ett godtyckligt program kommer avslutas eller inte, vilket är det berömda halting problem (https://en.wikipedia.org/wiki/Halting_problem ). En generalisering av det är Rices sats (https://en.wikipedia.org/wiki/Rice%27s_theorem ) som säger "all non-trivial semantic properties of programs are undecidable", och här hamnar antagligen double-free, use-after-free, array-index-out-of-bounds etc.

Permalänk
Skrivet av Erik_T:

Nej, det är väldigt uppenbart att du inte har kunskap på området.

Varför fick jag ens denna fråga då?
Ingen här på forumet kommer kunna bygga kompilatorer.

Citat:

Nej, det är inte möjligt i alla andra språk, och jo, man kan behöva röra språkets struktur för att kompilatorn skall kunna upptäcka vissa typer av fel.

Valgrind kan upptäcka vissa fall av överindexering, men inte alla, och den gör detta genom att lägga in extra kontroller runt de flesta minnesåtkomster vilket tenderar att göra program betydligt långsammare. Den typen av kontroll kan inte göras av en kompilator, utan bara genom att köra koden med instrumentering.

Låt oss titta på ett mycket enkelt litet C program:

#include <stdio.h> int main() { int arr[10]; int a; printf("Enter a number:"); scanf("%d", &a); arr[a] = a; printf("%d\n", a); return 0; }

Kommer det här programmet att göra en inkorrekt minnesaccess när det körs?
Det kan varken du eller någon kompilator svara på eftersom det beror på vad man ger den för indata, men vad som kan sägas om koden är att den är osäker då den använder indata utan att kontrollera att den har tillåtna värden.

Hade detta fungerat i Rust? Eller hade man blivit nekad?

Jag har stött på program där uint16_t + uint16_t adderas och skickas till en uint16_t. Detta fungerar, så länge talet ej överstiger 65535. Lösningen är att använda uint32_t och hoppas på att man ej skriver in allt för stora värden.

Orsaken varför uint16_t har med att spara minne.

Permalänk
Medlem
Skrivet av heretic16:

Varför fick jag ens denna fråga då?
Ingen här på forumet kommer kunna bygga kompilatorer.

Det är nog åtskilliga här på forumet som har skrivit en kompilator - inklusive undertecknad. Det är en ganska vanlig uppgift på universitetsutbildningar i datavetenskap. Oftast bara små, enkla kompilatorer, men ändå kompilatorer.

Citat:

Jag har stött på program där uint16_t + uint16_t adderas och skickas till en uint16_t. Detta fungerar, så länge talet ej överstiger 65535. Lösningen är att använda uint32_t och hoppas på att man ej skriver in allt för stora värden.

Jag antar att det där är i C eller C++.
Det där fungerar alldeles utmärkt oavsett vilka tal som är involverade. Man skall ju känna till att aritmetiken utförs modulo 2^16 så att man inte förväntar sig något annat, men det är väldefinierat i språken att så skall göras, så det bör man kunna räkna med att programmerare vet - annars får de läsa på bättre.

Permalänk
Skrivet av Erik_T:

Det är nog åtskilliga här på forumet som har skrivit en kompilator - inklusive undertecknad. Det är en ganska vanlig uppgift på universitetsutbildningar i datavetenskap. Oftast bara små, enkla kompilatorer, men ändå kompilatorer.

Kul! Hoppas B-språket kommer till liv.

Citat:

Jag antar att det där är i C eller C++.
Det där fungerar alldeles utmärkt oavsett vilka tal som är involverade. Man skall ju känna till att aritmetiken utförs modulo 2^16 så att man inte förväntar sig något annat, men det är väldefinierat i språken att så skall göras, så det bör man kunna räkna med att programmerare vet - annars får de läsa på bättre.

Jo, men vi säger t.ex. att man vill indexera en array som har en längd som motsvarar uint32_t.
Då blir det lite problem om maximala talet kan bara gå upp till uint16_t.

Enklaste sättet är bara ersätta alla uint16_t med uint32_t bit, och ge fan i att använda så höga tal
Men det blir ju 2 bytes dyrare!

Permalänk
Medlem
Skrivet av heretic16:

Kul! Hoppas B-språket kommer till liv.

Jo, men vi säger t.ex. att man vill indexera en array som har en längd som motsvarar uint32_t.
Då blir det lite problem om maximala talet kan bara gå upp till uint16_t.

Enklaste sättet är bara ersätta alla uint16_t med uint32_t bit, och ge fan i att använda så höga tal
Men det blir ju 2 bytes dyrare!

Har man plats för en array som har mer än 65536 platser så har man nog råd med 2 bytes extra för indexvariabler. Har du så mycket minne har du antagligen en 32-bitars CPU, och då är det ofta snabbare och enklare att använda 32-bitars variabler än 16-bitars, så du vinner antagligen prestanda på det sättet.

Permalänk
Skrivet av Erik_T:

Har man plats för en array som har mer än 65536 platser så har man nog råd med 2 bytes extra för indexvariabler. Har du så mycket minne har du antagligen en 32-bitars CPU, och då är det ofta snabbare och enklare att använda 32-bitars variabler än 16-bitars, så du vinner antagligen prestanda på det sättet.

Okej. Detta visste jag inte. Prestanda är något som jag föredrar.

Du tvekar lite när du skriver...antagligen. Är det så?

Permalänk
99:e percentilen
Skrivet av heretic16:

Nu när Microsoft har sagt att dom väljer Rust framför C och C++ när nya icke GC-projekt ska byggas. Då drar jag slutsatsen att Rust är ett bättre språk helt enkelt.

Ja, jag har läst många rubriker och läst vissa debatter på Reddit där vissa hävdar att Rust är bättre än C++ på alla möjliga sätt. Typ som ett "C++ done right". Ungefär som Kotlin-användare säger att Kotlin är ett "Java done right". Då drar jag slutsatsen att dessa programmeringsspråk är bättre.

Jo, det vet jag.
Men alla dessa språk som kommer upp som ska göra in princip samma sak som C och C++, måste väll vara bättre trots allt?
Jag menar, du uppfinner inte ett C++ liknande språk, om språket är sämre?

Programmeringsspråk är inte strikt ordnade från "bäst" till "sämst". Detta (och motsvarande för ramverk etc) har du fått förklarat för dig i tråd efter tråd genom åren, men det verkar inte hjälpa.

Citat:

Du verkar störa dig på att jag undersöker olika fördelar och nackdelar?

Nej, om det bara var det du gjorde, och förmedlade, skulle ingen ha några invändningar.

Men ja, ditt sätt att argumentera kan stundtals vara provocerande, även om det inte är din avsikt. Det är som att du inte alls tar till dig vad någon skriver. Att dessutom konstatera att "det är religion" och därför "inte skoj" med fler alternativ framstår minst sagt som märkligt, med tanke på hur du själv i åratal torgfört synnerligen dogmatiska åsikter om programmeringsspråk här i forumet.

Men jag måste också säga att jag även förnimmer den där sidan av dig som faktiskt vill undersöka olika aspekter, vrida och vända på saker och skapa bra mjukvara. Det är förbryllande.

Citat:

Nej, jag har inte sådan kunskap. Jag tänkte bara att det borde vara möjligt idag, med tanke på att det är möjligt i alla andra språk? Jag menar, man behöver väll inte röra språkets struktur om man t.ex. låter kompilatorn granska koden innan den kompileras?

Du efterfrågar lösningen på ett problem som är ekvivalent med haltproblemet.

Citat:

T.ex. låt oss säga att jag ska kompilera en C kod som överindexerar. Min kompilator kompilerar koden, och sedan granskar min kompilerade applikation med t.ex. Valgrind och säger åt mig att denna kod som jag har skrivit är fel på, och felet är här. För överindexering kan Valgrind faktiskt känna igen.

Valgrind är ett verktyg för dynamisk analys, som @Erik_T, @orp och framförallt @Curik redan förklarat. Det är helt ojämförbart med en statisk typcheckare.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Hedersmedlem
Skrivet av heretic16:

Varför är det så som hävdar det?
Ja, jag tar dessa mätningar med en nypa salt, men det måste väll ligga någon sanning bakom varför vissa mätningar så är det Rust som är snabbare?

Framför allt är det väl roligt när språket, trots utökad säkerhet, presterar väl? Det kan ju också finnas lägen där kompilatorn kan använda de extra garantierna för att unna sig val som är effektiva men kanske inte helt pålitliga i andra språk (jämför med restrict i c).

Skrivet av heretic16:

Nu när Microsoft har sagt att dom väljer Rust framför C och C++ när nya icke GC-projekt ska byggas. Då drar jag slutsatsen att Rust är ett bättre språk helt enkelt.

Skrivet av heretic16:

Jag har inte fått bevisat vad Rust inte kan. Som jag har hört så verkar Rust kunna allt det C++ kan, plus att Rust har högre säkerhet och snabbheten är antingen likadan eller bättre.

Skrivet av heretic16:

Ja, jag har läst många rubriker och läst vissa debatter på Reddit där vissa hävdar att Rust är bättre än C++ på alla möjliga sätt. Typ som ett "C++ done right". Ungefär som Kotlin-användare säger att Kotlin är ett "Java done right". Då drar jag slutsatsen att dessa programmeringsspråk är bättre.

Skrivet av heretic16:

Men alla dessa språk som kommer upp som ska göra in princip samma sak som C och C++, måste väll vara bättre trots allt?
Jag menar, du uppfinner inte ett C++ liknande språk, om språket är sämre?

Som sagt är ju "bättre språk" ett krångligt begrepp. Bättre på vad? De flesta språk kan ju göra allting, men lösningen kan vara mer eller mindre omständlig beroende på vad man väljer. Och har man redan existerande kod som man vill fortsätta använda (och utvecklare som är vana vid den befintliga miljön) är det troligen inte särskilt attraktivt att helt byta språk även om det skulle vara möjligt.

Skrivet av heretic16:

Jag kör Microsoft Visual Studio Community och jag har inte sett ett sådant verktyg som kan analysera minnet t.ex. överindexering eller glömde frigöra dynamiskt allokerat minne. Detta skulle jag uppskatta för jag har behov utav sådant, faktiskt väldigt mycket. Jag lägger ned timmar på att få till indexeringen korrekt då jag håller på med machine learning i C. Jag vet...det är tokigt. Men det är sjukt snabbt.

I Linux brukar jag köra Valgrind där jag kollar om jag överindexerar. Detta tycker jag är smidigt. Jag saknar sådant verktyg i MSVSC-IDE:n.

Den kollar hur mycket allokerat minne jag deklarerar och kollar hur mycket jag förbrukar?

Har du något exempel på sådant verktyg i Microsoft Visual Studio Community?

Har du testat AddressSanitizer? Den fångar en del saker i alla fall.

Permalänk
Medlem
Skrivet av heretic16:

Okej. Detta visste jag inte. Prestanda är något som jag föredrar.

Du tvekar lite när du skriver...antagligen. Är det så?

Oftast, men inte alltid. Det finns så många olika specialfall att det finns få absoluta sanningar när det gäller vad som ger bäst prestanda.

Permalänk
Datavetare
Skrivet av heretic16:

Okej. Detta visste jag inte. Prestanda är något som jag föredrar.

Du tvekar lite när du skriver...antagligen. Är det så?

I praktiken lär prestanda mellan att indexera med 16-bit tal istället för 32/64-bit tal vara minimal. Men på aktuella CPU-arkitekturer som x86_64, ARM64 och ARM blir det något mindre effektiv maskinkod

#include <stdint.h> int xs_with_u16(int *xs, uint16_t index) { return xs[index]; } int xs_with_u32(int *xs, uint32_t index) { return xs[index]; }

X86_64

xs_with_u16(int*, unsigned short): movzx esi, si mov eax, DWORD PTR [rdi+rsi*4] ret xs_with_u32(int*, unsigned int): mov esi, esi mov eax, DWORD PTR [rdi+rsi*4] ret

movez är en lägre instruktion jämfört med mov. Rent generellt krävs ofta ett extra prefix för instruktioner på x86_64 om man inte jobbar med 32/64-bit

ARM64

xs_with_u16(int*, unsigned short): and x1, x1, 65535 ldr w0, [x0, x1, lsl 2] ret xs_with_u32(int*, unsigned int): ldr w0, [x0, w1, uxtw 2] ret

Här är skillnaden uppenbar.

Men just på den punkten är det ingen skillnad mellan C, C++ och Rust. De måste alla förhålla sig till HW.

Givet roten till denna diskussion, det finns en skillnad i overflow med ”signed integers”!

Det är ”undefined behavior” i C och C++. Rust har lite speciellt hantering här, i debug-buggen får man ”panic” medan det blir det de flesta förväntar sig även händer (d.v.s. det som händer i _de flesta_ fall med C/C++, man ser däremot på LLVM IL att kompilatorn gör skillnad mellan C/C++ och Rust då). I.e. I Rust är beteendet väldefinierat.

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 heretic16:

Har du något exempel på sådant verktyg i Microsoft Visual Studio Community?

Historiskt sett har det varit betallösningar som gällt men på senare år kom Valgrind men när jag hade som mest behov så fanns det bara för Linux. Huruvida VSC har liknande verktyg vet jag tyvärr inte.

Permalänk
Medlem
Skrivet av heretic16:

Ingen här på forumet kommer kunna bygga kompilatorer.

Jag har stött på program där uint16_t + uint16_t adderas och skickas till en uint16_t. Detta fungerar, så länge talet ej överstiger 65535. Lösningen är att använda uint32_t och hoppas på att man ej skriver in allt för stora värden.

Orsaken varför uint16_t har med att spara minne.

Du vet att man får bygga kompilatorer redan på universitetet va? Jag har skrivit flera stycken även efteråt.

Man "skickar" inte något till en uint16_t. Och att det fungerar så länge du inte skriver ett tal större än vad datatypen stöder är ju.... rätt grundläggande kunskaper.

Sorry men det låter kanske som att du borde ta ett steg tillbaka och låta andra som har mer erfarenhet och kunskap få svara på dina frågor istället för att göra dessa svepande och breda påståenden.

Permalänk
Skrivet av Elgot:

Framför allt är det väl roligt när språket, trots utökad säkerhet, presterar väl? Det kan ju också finnas lägen där kompilatorn kan använda de extra garantierna för att unna sig val som är effektiva men kanske inte helt pålitliga i andra språk (jämför med restrict i c).

Självklart är det kul att se att Rust presterar bättre än C++ och C i vissa fall. Då kanske C och C++ ska lära sig av detta. Det är min tanke.

Citat:

Har du testat AddressSanitizer? Den fångar en del saker i alla fall.
<Uppladdad bildlänk>

Nej. Men detta låter häftigt.
Kan den jämföra om jag adderar två uint8 med varandra och skicka till en uint8? Det blir ju lite tokigt där då uint8 kan högst ha 255.

Permalänk
Medlem
Skrivet av heretic16:

Kan den jämföra om jag adderar två uint8 med varandra och skicka till en uint8? Det blir ju lite tokigt där då uint8 kan högst ha 255.

Det blir bara tokigt om man tänkt fel och egentligen ville göra någonting annat.
Addition av unsigned numbers är väl definierat i C/C++, och då aritmetiken på N-bitars unsigned alltid utförs modulo 2^N så får resultatet alltid plats i en variabel av samma storlek.
Så det är inget som normalt borde varnas för.

Permalänk
Medlem
Skrivet av heretic16:

Kan den jämföra om jag adderar två uint8 med varandra och skicka till en uint8? Det blir ju lite tokigt där då uint8 kan högst ha 255.

Varför sparar du ens summan i en uint8 om du misstänker att den kan vara större än 255 och du inte vill att den ska rulla över till 0 igen? Det är väl bara att använda dig av rimliga storlekar från början utifrån den datan/logiken som du jobbar med?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Självklart är det kul att se att Rust presterar bättre än C++ och C i vissa fall. Då kanske C och C++ ska lära sig av detta. Det är min tanke.

Fast om det är som med restrict, så är det ju välkänt att det kan finnas mera att hämta men det kan vara svårt att använda i utom i specialfall.

Skrivet av heretic16:

Kan den jämföra om jag adderar två uint8 med varandra och skicka till en uint8? Det blir ju lite tokigt där då uint8 kan högst ha 255.

Dock är det ju som sagt inte ett fel, utan helt enligt specifikationen. Ibland är det väl också precis så man vill att det skall fungera?