2010/04/29

Jeśli używacie kompilacji z warunkową optymalizacją, może okazać się że przeoczycie błędy w waszym kodzie


size_t calc_segcnt(size_t *ret_segcnt)
{

   size_t segcnt;

   ...


   while( cond )
   {
      segcnt = blablabla
   }
   if( ret_segcnt )
         *ret_segcnt = segcnt;


   ...


}


Przy wyłączonej optymalizacji kompilacja przejdzie bez ostrzeżeń. Po włączeniu optymalizacji otrzymacie:
warning: “segcnt” may be used uninitialized in this function

Inicjalizacja segcnt jest zalezna, od „cond” który może się nie wykonać, a puzniej mamy warunkowe przypisanie pod adres wyłuskany ze wskaznika. Podczas optymalizacji widocznie kompilator chce uprościć kod i wykrywa niezainicjalizowana zmienna. Brak optymalizacji widocznie nie wywołuje kodu sprawdzającego ścieżki inicjalizacji.

1 komentarz:

Leming pisze...

To ja już wolę kodować przy pomocy języka A.

http://nonsensopedia.wikia.com/wiki/J%C4%99zyk_A

Prześlij komentarz