Sida 3 av 3
Re: Hur identifiera bortoptimerad kod?
Postat: 31 maj 2020, 22:03:24
av Jan Almqvist
Du skojar med mej nu eller?
Med "skriva sönder" menar jag att såklart inte att själva RAM-minnet går sönder utan det är innehållet som förstörs när man skriver på fel ställe och skriver över t.ex. stack eller variabler.
I vissa fall kan man också "skriva sönder" programkod som vilket kan utnyttas för att t.ex. exekvera skadlig kod.
Re: Hur identifiera bortoptimerad kod?
Postat: 31 maj 2020, 22:11:50
av TomasL
Ok, tolkade det som att du menade att fysiskt skriva sönder minnet.
Re: Hur identifiera bortoptimerad kod?
Postat: 1 juni 2020, 07:39:02
av guckrum
Hur ser ett minimalt exempel med "felet" ut?
Re: Hur identifiera bortoptimerad kod?
Postat: 1 juni 2020, 08:16:31
av Jan Almqvist
Jag har provkört koden på
https://www.onlinegdb.com/online_c_compiler.
Om parameter opt ligger i intervallet [2,5] är allt OK.
Kod: Markera allt
opt = 2, str = 1.2345
opt = 3, str = 12.345
opt = 4, str = 123.45
opt = 5, str = 1234.5
Men om parameter opt har värdet 1 kommer variabeln i att bli -1:
Kod: Markera allt
if( dot == i) {
str[i] = i2str_dot;
i--; <------ Här slår i runt vid nedräkning från 0 och blir -1.
}
str[i] = r + 48u; <------ Här skrivs det *utanför* str.
Re: Hur identifiera bortoptimerad kod?
Postat: 1 juni 2020, 22:34:12
av TomasL
opt kan bara ta dessa värden:
Kod: Markera allt
#define I2STR_NODOT 0
#define I2STR_1DEC 5
#define I2STR_2DEC 4
#define I2STR_3DEC 3
#define I2STR_4DEC 2
#define I2STR_PLUSSIGN 8
#define I2STR_ADDSPACE 16
#define I2STR_L_ADJ 0
#define I2STR_R1ADJ 192
#define I2STR_R2ADJ 160
#define I2STR_R3ADJ 128
#define I2STR_R4ADJ 96
#define I2STR_R5ADJ 64
#define I2STR_R6ADJ 32
Opt består av en kombination av ovanstående, 1 från varje grupp.
Risken att nånting konstigt kan hända är i princip noll.
Re: Hur identifiera bortoptimerad kod?
Postat: 2 juni 2020, 08:25:51
av guckrum
Om du visar ett minimalt "stand-alone"-exempel som innehåller felet behöver ingen spekulera. Dessutom lär du ju behöva ett sådant om du skall buggrapportera.