Enkla men fatala buggar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Enkla men fatala buggar

Inlägg av lillahuset »

Skicka koden (minsta möjliga) så kollar jag imorgon.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Enkla men fatala buggar

Inlägg av Mr Andersson »

Prova med -Wformat-security. Har funnits i gcc i många år men vissa vendors har den avstängd som default.
-Wall är lite förrädisk då den skippar ganska många varningstyper. format-security är en av dem.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Enkla men fatala buggar

Inlägg av jesse »

Aha, jag trodde -Wall betydde alla varningar. Dumt att det heter så annars.
Jag ska prova med -Wformat-security.

EDIT: Ja, nu får jag en varning. Det ska jag ha som standard i fortsättningen. :)
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Enkla men fatala buggar

Inlägg av jesse »

lillahuset skrev:Skicka koden (minsta möjliga) så kollar jag imorgon.
Hur mycket vill du ha? :D
Code analys:
45 filer, totalt 24138 rader, 804899 tecken
Ehm.. men nu var det ju bara printf() som var problemet, så jag brydde mig inte om koden runt om.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Enkla men fatala buggar

Inlägg av lillahuset »

Jag tror du bör ha båda. Jag har för mig att det finns en -Wpedantic också.

Jag läste om din fråga och log för mig själv över min slarviga läsning tidigare. C är ett underbart språk, det ger en alla möjligheter att göra sig illa. Tacka Kernighan&Ritchie för det. :D

Du har ju svaret så vi kan strunta i koden.
xxargs
Inlägg: 10183
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Enkla men fatala buggar

Inlägg av xxargs »

C uppkom för att hjälpa till vid OS-skapande och är väldigt mycket formad av problemen kring detta. Uppenbarligen duger den till OS-snickrande än idag trots alla sina nackdelar - frågan att ställa är snarare varför används inte ett bättre alternativ idag över 40 år senare???

och vilken språkmiljö skulle då vara lämplig för det ???
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Enkla men fatala buggar

Inlägg av jesse »

För att "bättre" alternativ kanske inte alltid är anpassat för enklare (maskinnära) programmering, utan förutsätter att man har närmast obegränsat med minne och hastighet. Och de andra mer "maskinnära" alternativen (som jag inte känner till så bra, kanske "forth" är ett av dem) inte är helt utvecklade eller generella.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Enkla men fatala buggar

Inlägg av lillahuset »

FORTH är både välutvecklat och generellt. Jag tror största anledningen till att vi ser så lite FORTH är att det är stackbaserat och då blir folk förvirrade. Och kanske lite väl minimalistiskt. :)
mulpac
Inlägg: 9
Blev medlem: 8 augusti 2013, 13:10:59

Re: Enkla men fatala buggar

Inlägg av mulpac »

Tror faktiskt det är svårare att läsa postfix jämfört med infix, i synnerhet när värden lagras på stacken när andra operationer utförs. Lärde mig åtminstone själv väldigt snabbt att använda HP-räknare och började tycka att vanliga miniräknare var sämre att räkna på. Har däremot aldrig upplevt det som lättsamt att läsa, granska, och ändra program för HP-räknare eller skrivna i FORTH, jämfört med infix-språk.
peolah
EF Sponsor
Inlägg: 502
Blev medlem: 22 mars 2010, 02:10:47

Re: Enkla men fatala buggar

Inlägg av peolah »

Det är ingen bugg, snarare en fallgrop !

För dom som eventuellt håller på med Atmel AVR assembler så vill jag berätta om något jag och många andra svurit om mer än en gång. Då jag använt en massa olika processorer genom åren, har jag iaf glömt bort detta ett par gånger.

SBR och CBR är sk mnemonics för "Set Bit Register" och "Clear Bit Register" - men SBR och CBR är igentligen logical OR respektive logical AND
och har samma opcode som dessa, men finns med i AVR's datablad som egna instruktioner, alla övriga instruktioner som relaterar till bitar (0-7) är just bitar (0 - 7 ) Visst står det hur man skall använda SBR/CBR om man läser ordentligt - men det är många som missat detta !

SBR r16, 3 = ORI r16, 0x03 - "00000011"
CBR r16, 3 = ANDI r16, 0x03 - "000000011"

Nedan är vad man förväntat sig av dessa "instruktioner" om vi pratar logical or / and

ORI r16, (1<<3)
ANDI r16, ~(1<<3)
MagnusA
Inlägg: 8
Blev medlem: 20 december 2011, 10:36:11

Re: Enkla men fatala buggar

Inlägg av MagnusA »

Jag skulle säga att det är en bitwise OR/AND, och inte en logisk, och att det står fel i databladet (eller så är de bara otydliga med att de menar en logisk OR/AND per bit). Funktionen stämmer ju bra med en bitwise OR, där flaggan "00000011" ju kommer att sätta bitarna 6 och 7.

EDIT: Lite gammalt inlägg såg jag nu, men men...
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Enkla men fatala buggar

Inlägg av JimmyAndersson »

Igår hittade jag felet i mitt nya diagramverktyg. I visa scenarion så visades helt enkelt inte diagrammet.

Jag gick igenom allt flera gånger. Främst beräkningar, indenteringar och hakparenteser. Men icke.
Gjorde en ny kod med enbart genereringen av diagrammet. Samma fel, men nu varje gång.
Men när jag tog bort en include-rad så försvann felet. Hm.. en liten textfil på fyra rader? Vad kan den göra för skada?

Så jag lusläste filen som skulle inkluderas och hittade orsaken:
En extra radbrytning (tom rad) sist i filen. Det var man ju inte direkt beredd på. :)

Det hade kunnat avhjälpas av att ha en felkontroll (avlusning om man så vill) av indata även från de filer som ska inkluderas i koden.
Speciellt i det här fallet eftersom utdatan enbart skulle vara bild-data...

Bästa debug-metoden: Misstänk *allt*. (Även små obetydliga filer uppenbarligen...) Men det visste vi ju egentligen.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Enkla men fatala buggar

Inlägg av Micke_s »

sbr cbr är rolig tillsammans med interrupt. De är inte "atomic" tyvärr.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Enkla men fatala buggar

Inlägg av jesse »

Råkade ut för en intressant bug idag.
Språk: C
Kompilator: GCC
MCU: ATSAMC21 (Atmel 32bit)

Kod:

Kod: Markera allt

uint32_t value;
uint32_t bitpos;
// check if bit is set
value = 0xf0f0f; // (till exempel)
bitpos = xxx; // some random number
if (value & (1 << bitpos)) { .... code ... }
Här vet vi ju vad som händer då bitpos < 32.
Men vad händer om bitpos > 31?

Självklart har man ju testat det, och när det gäller 32-bitars unsigned int så visar det sig att (1 << bitpos) blir 0 om bitpos > 31 (ettan skiftas bort och försvinner åt vänster).
Men så enkelt är det inte!

Jag fick galna fel i ett program idag på grund av att jag hade gjort det antagandet.

I verkligheten är det så här (när det gäller den aktuella processorn i alla fall):
32-bitars-variabeln bitpos "huggs av" så att endast de sista åtta bitarna används för att shifta ettan.
Det betyder att (1 << 258) är detsamma som (1 << 2) .... dvs. egentligen gör den (1 << (bitpos & 0xff))

Jag har använt (1 << n) väldigt ofta i olika program, där n ibland kan överstiga 31. Men idag hamnade jag alltså i situationen att antalet skiftningar översteg 255, vilket givetvis gav galna konsekvenser.
Programmet hade redan testats under en veckas tid och allt funkade som det skulle, ända tills jag testade att mata in ganska extrema (men tillåtna) data. Då hände detta.
Det roliga var att då jag redan testat nästan alla andra kombinationer så var jag säker på att det inte skulle uppstå några fel. Jag såg det som ren rutin att även testa de sista exemplen, bara för testprotokollet skulle fyllas i. Därför blev jag helt paff när jag såg kaoset som uppstod.

Lösningen blev:

Kod: Markera allt

if (bitpos < 32) {
   if (value & (1 << bitpos)) { ... code ... }
}
Användarvisningsbild
morten.dynamite
Inlägg: 62
Blev medlem: 9 juni 2012, 19:30:30
Ort: Charlottenberg

Re: Enkla men fatala buggar

Inlägg av morten.dynamite »

jesse

Jag tycker det är logiskt, de flesta CPU jag har varit i kontakt med gör så använder bara 8bit i shift instruktioner, behövs ju egentligen inte mera än 8bit om inte processorn jobbar med mera än 256 bitars register.

Om du kollar på https://developer.arm.com/documentation ... ctions/lsl så ser du hur det är för ARM.
Skriv svar