Enkla men fatala buggar
Postat: 18 maj 2013, 00:05:49
Kan vi ha denna tråden typ klistrad eller nått, tanken är att lista fallgropar, vilka kan generera buggar, varav vissa kan vara svåra att hitta.
Nåväl, exempel 1:
En lurig sak, dessutom extremt lätt att göra.
Man kan undvika den genom att slå på alla varningar, till exempel "wall" i gcc.
Dock, en mycket bättre variant är att vända på det.
Om man istället konsekvent sätter konstanten på vänster sida, dvs
Då får man garanterat ett felmeddelande, så man kan fixa tioll raden till dess rätta innehåll, dvs
Exempel 2.
Ovanstående kod funkar, kanske ibland, ibland alltid, ibland inte, ibland funkar den slumpmässigt.
Problemet uppstår när den högre byten i "arr" inte är 0, eftersom "i" i detta fallet är 32 bitar, och man läser in från en 16 bitars array, så kan vad som helst hamna i de övre 16 bitarna i variabeln "i",
Samma gäller ju även om "arr" är en vanlig variabel, då får de övre 16 bitarna "slumpmässiga" värden, dvs värden från dataomrrådet intill "arr".
för att slippa detta måste man naturligtvis casta 16bitars variabeln, så man enbart läser in 16 bitar, dvs
Det var två exempel på fallgropar, fyll gärna på med fler.
Nåväl, exempel 1:
Kod: Markera allt
if (i=1){......}
Man kan undvika den genom att slå på alla varningar, till exempel "wall" i gcc.
Dock, en mycket bättre variant är att vända på det.
Om man istället konsekvent sätter konstanten på vänster sida, dvs
Kod: Markera allt
if (1=i){....}
Kod: Markera allt
]if (1==i){....}
Kod: Markera allt
uint32 i;
sint16 arr[..]
i = arr[x++]
i |= arr[x++]<<16
Problemet uppstår när den högre byten i "arr" inte är 0, eftersom "i" i detta fallet är 32 bitar, och man läser in från en 16 bitars array, så kan vad som helst hamna i de övre 16 bitarna i variabeln "i",
Samma gäller ju även om "arr" är en vanlig variabel, då får de övre 16 bitarna "slumpmässiga" värden, dvs värden från dataomrrådet intill "arr".
för att slippa detta måste man naturligtvis casta 16bitars variabeln, så man enbart läser in 16 bitar, dvs
Kod: Markera allt
uint32 i;
sint16 arr[..]
i = (uint16)arr[x++]
i |= arr[x++]<<16