Hur identifiera bortoptimerad kod?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Hur identifiera bortoptimerad kod?

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45272
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg av TomasL »

Ok, tolkade det som att du menade att fysiskt skriva sönder minnet.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Hur identifiera bortoptimerad kod?

Inlägg av guckrum »

Hur ser ett minimalt exempel med "felet" ut?
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Hur identifiera bortoptimerad kod?

Inlägg 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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45272
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hur identifiera bortoptimerad kod?

Inlägg 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.
guckrum
Inlägg: 1686
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Hur identifiera bortoptimerad kod?

Inlägg 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.
Skriv svar