Newsgroup: it.comp.os.linux.development
Titolo: problemi con gcc e ottimizzazioni

Ciao,
gcc si comporta in modo molto strano con questo programma, in funzione
delle varie ottimizzazioni.
Qualcuno sa spiegarmi perche'?
#include <stdio.h>
/*  compiled on linux 2.4.2
 *  gcc -v
 *  Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.3/specs
 *  gcc version 2.95.3 20010219 (prerelease)
 *  
 *  PROBLEM:
 *  
 *  gcc -O0 -o outstack outstack.c 
 *  ./outstack 
 *  Completed.
 *  
 *  gcc -O1 -o outstack outstack.c 
 *  ./outstack 
 *  Segmentation fault
 *  
 *  gcc -O2 -o outstack outstack.c 
 *  ./outstack 
 *  Segmentation fault
 *  
 *  gcc -O3 -o outstack outstack.c 
 *  ./outstack 
 *  Completed.
 *  
 *  */
/* NLOOP must be high enough. 
 * E.g., 2096000L is not enough to cause the error. */
#define NLOOP 2097000L
static void do_nothing(char *x)
{
  return;
}
int main()
{
  int k=16;
  char c;
  {
    int j;
    for(j=0;j<NLOOP;j++) {
      if(k>=0) {	
        do_nothing(&c);		/* The error disappears if you remove this call */
        {
          char d[k];		/* If you move this to the beginning then the error disappears.
                           Also, the error disappears if you say, e.g., "char d[16]" */
          do_nothing(d); /* This can be removed; it seems that the error is caused 
                            by the memory allocation for d[k] */
        }
      }
    }
  }
  printf("Completed.\n");
  return(0);
}
Come vedete e' molto semplice, ma con O0 e O3 non da' problemi, e con O1 O2
si.
A parte info e man sulle ottimizzazioni, c'e' qualche link che spiega in
dettaglio cosa fanno O0/1/2/3 ?
TNX
(ovviamente il programma reale e' diverso, questo e' lo scheletro...)
-- 
Pa.Ped, Como
http://www.fastflow.it/~paolop

 Qualcuno sa spiegarmi perche'?
Hai provato a compilare con -Wall? Per esperienza personale, ti posso dire
che compilando con -Ox un sorgente che causa warning, si rischia di avere
comportamenti inaspettati. Quindi prova ad eliminare gli eventuali warning
e poi prova le ottimizzazioni.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

 e poi prova le ottimizzazioni.
$ gcc -Wall -O2 -o outstack outstack.c
$ ./outstack
Segmentation fault
nada.
come prima.
-- 
Pa.Ped, Como
http://www.fastflow.it/~paolop
ICQ: 4755831

 Segmentation fault
Vabbe', era un ipotesi...
Non mi viene in mente niente, a parte i soliti puntatori mal utilizzati...
bisognerebbe vedere il codice.


 bisognerebbe vedere il codice.
il codice era allegato al msg originale, nessun uso di puntatori (beh'...
un vettore...:-)
-- 
Pa.Ped, Como
http://www.fastflow.it/~paolop
ICQ: 4755831
VOTE AGAINST SPAM! 
http://www.politik-digital.de/spam/it/
Contro i brevetti software: 
http://petition.eurolinux.org/index_html

Pa.Ped.it
 @ 
www.fastflow.it/~paolop
 wrote:

Con O3 sparisce la funzione "do_nothing()" .... Probabilmente e' un bug del 
compilatore... In effetti hai utilizzato un estensione che il gcc dichiara 
di supportare ( un array dimensionato dinamicamente ); ma non e' standard c 
( ne c++ ).
Prova a segnalarlo al gruppo di sviluppo del gcc.
Qualcuno ha fatto una prova su il gcc della redhat 7.0 ( 2.96.x ) per 
vedere se da lo stesso errore ? ( Sulla debian 2.2, gcc 2.95.x, lo da' )

 un vettore...:-)
Oops... scusa, ero convinto che fosse pseudo-codice... L'ho detto io che
studio troppo e quando arrivo a fine giornata sono esaurito! ;-)
Dammi qualche minuto...
[Prove di compilazione/esecuzione]
Dunque, provando il tuo codice con gcc version 2.95.2 19991024 (release),
sotto win98, si verificano gli stessi errori che tu hai descritto. Ora non
ho a disposizione il pinguino (mi tocca rebootare), ma appena posso provo
anche li'.


 anche li'.
bisognerebbe guardare il codice asm generato (e capirlo).
Io ho fatto un semplice diff tra i vari output con le varie ottimizzazioni.
Leggo e scrivo in C, ma l'ASM non lo capisco ancora... :-)
Rimaneggiando il codice si riesce a far sparire l'errore, il fatto e' che
nella versione originale si trova all'interno di una libreria di 500Kb di
codice sorgente, e capire che il problema era li' non e' stato facile.
(non sono stato io).


 Leggo e scrivo in C, ma l'ASM non lo capisco ancora... :-)
Eccomi qua! :-)
Dopo aver provato il tuo codice anche sotto linux:
Linux 2.2.16 #3 Sun Nov 26 17:10:04 CET 2000 i586
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
ho potuto constatare che si verificano ancora gli stessi errori.
Ho provato a guardare i sorgenti assembly generati dalle compilazioni con
le 4 ottimizzazioni diverse, ma ammetto di non averci capito abbastanza per
vedere dove sta l'errore.


  *  gcc version 2.95.3 20010219 (prerelease)
LO stesso problema lo da anche l'egcs distribuito con Mandrake ...


Sarebbe buona norma non utilizzare array dinamici in questo modo, che peraltro
non funzionano su tutti i compilatori: forse sono un estensione del gcc, ma mi
pare che neanche in questo caso vadano molto bene ...
In realta' tu stai dicendo al compilatore di allocare nello stack un array d, di
k elementi, pero' k non viene modificato, quindi probabilmente il compilatore lo
ottimizza, facendolo diventare una costante: questo avviene pero' solo in certi
casi ( -Ox ), quindi il comportamento e' incosistente.
Un consiglio semplice, che ti porterebbe a costruire codice un po' piu' standard
e' comunque di usare la memoria dinamica per questo genere di cose (che tra
l'altro non sara' una cosa molto diversa da quella che fa il compilatore per
te), del tipo:
     if (k>=0) {
         do_nothing(&c);      
         {
           char * d = (char *) malloc( k * sizeof(char) );
 
           do_nothing(d); 
           free(d);
         }
Se poi passi al C++ hai un sacco di vantaggi :-)
Ciao.
-- 
+---------------------------------------------------------------------------+
| Francesco Monica
|  Dipartimento di Ingegneria dell'Informazione                             |
|  Parco Area delle Scienze 181/a                     FAX: 
+39(0521)905723
  |
|  I-43100  Parma                                     Tel: 
+39(0521)843125
|  ITALY                                                                    |
+---------------------------------------------------------------------------+
|Life is like a Windows box. You never know what bluescreen you're gonna get|
+---------------------------------------------------------------------------+