Bonjour à tous, Je voulais vous signaler (ainsi qu'aux autres destinataires) un problème plutôt grave selon moi qui se produit avec l'utilisation de Linux et de gcc en salles machines (et au labo). Le compilateur des salles F206 et F207 (gcc ...) laisse passer des erreurs de syntaxe graves en C, en l'occurence, il ne nécessite pas qu'une variable soit déclarée en tête de bloc. (Je rappelle à ceux qui ne connaitraient pas bien C qu'un bloc en C (tout ce qui est entre accolades) est constitué de deux blocs successifs, un bloc de déclarations suivi d'un bloc d'instructions). On peut dans cet environnement déclarer ses variables "au vol" comme en java. La seule chose qu'il controle apparemment est que la variable est déclarée avant d'être utilisée. L'inconvénient pour débuguer est majeur, puisqu'une erreur fréquente est justement de masquer une variable globale par une locale... et donc que l'on ne peut plus vérifier ça facilement en regardant ne serait-ce que ce qui est déclarer en global et dans le main. [Les étudiants trouvent d'ailleurs tout ça bien peu gênant, puisque ça marche ! ]. Bref, c'est gênant pédagogiquement ET pratiquement. Sans doute ceux qui maintiennent gcc se sont-ils dits que leuc code de compilo java, bien optimisé, pouvait bien inspirer leur code de compilo C ! Mais si la portée des variables en java est moins importante puisqu'il s'agit d'objet, etc. elle est cruciale en C. C'est très dommage que les gens qui écrivent les compilos soient à ce point ignares ! Mais ça n'est pas la seule gêne. Vu que les logiciels sont compilés eux-mêmes avec ce compilo foireux, d'autres problèmes pourraient surgir ailleurs. Et c'est peut-être ce qui m'arrive dans mon petit coin stupide - à bêtement utiliser des librairies. En MOTIF, je n'obtiens pas les mêmes erreurs d'exécution - dans mon environnement [samsung = sofia pour les intimes] et en salles F206-07. Pour les étudiants, c'est gênant, car dans les salles F, leurs codes tournent avec quelques problèmes, mais ça va selon eux, et moi au labo, le même code n'affiche rien - ce qui est très normal sur leur source d'après la théorie que je maîtrise (mais pas eux), et je ne sais pas trop comment les noter, car ils n'ont pas été avertis en développant que leur code était incorrect. Ne concluez pas trop vite que le problème est purement pédagogique ou que le labo est mieux installé. Le bug gcc que je vous signale marche très bien sur sofia aussi ! En espérant que vous saurez comprendre l'importance de ce problème (quelqu'en soit la raison effective ...). Catherine
gcc -Wall -pedantic ... reglera une grande partie de tes problèmes. Si les étudiants ont eu un cours sur Make, ils sauront régler les options de gcc sans compliquer leur cycle de développement. Emmanuel On Wed, 2005-01-26 at 11:11, Catherine Recanati wrote:
Bonjour à tous,
Je voulais vous signaler (ainsi qu'aux autres destinataires) un problème plutôt grave selon moi qui se produit avec l'utilisation de Linux et de gcc en salles machines (et au labo).
Le compilateur des salles F206 et F207 (gcc ...) laisse passer des erreurs de syntaxe graves en C, en l'occurence, il ne nécessite pas qu'une variable soit déclarée en tête de bloc. (Je rappelle à ceux qui ne connaitraient pas bien C qu'un bloc en C (tout ce qui est entre accolades) est constitué de deux blocs successifs, un bloc de déclarations suivi d'un bloc d'instructions).
On peut dans cet environnement déclarer ses variables "au vol" comme en java. La seule chose qu'il controle apparemment est que la variable est déclarée avant d'être utilisée. L'inconvénient pour débuguer est majeur, puisqu'une erreur fréquente est justement de masquer une variable globale par une locale... et donc que l'on ne peut plus vérifier ça facilement en regardant ne serait-ce que ce qui est déclarer en global et dans le main. [Les étudiants trouvent d'ailleurs tout ça bien peu gênant, puisque ça marche ! ].
Bref, c'est gênant pédagogiquement ET pratiquement. Sans doute ceux qui maintiennent gcc se sont-ils dits que leuc code de compilo java, bien optimisé, pouvait bien inspirer leur code de compilo C ! Mais si la portée des variables en java est moins importante puisqu'il s'agit d'objet, etc. elle est cruciale en C. C'est très dommage que les gens qui écrivent les compilos soient à ce point ignares !
Mais ça n'est pas la seule gêne.
Vu que les logiciels sont compilés eux-mêmes avec ce compilo foireux, d'autres problèmes pourraient surgir ailleurs. Et c'est peut-être ce qui m'arrive dans mon petit coin stupide - à bêtement utiliser des librairies.
En MOTIF, je n'obtiens pas les mêmes erreurs d'exécution - dans mon environnement [samsung = sofia pour les intimes] et en salles F206-07. Pour les étudiants, c'est gênant, car dans les salles F, leurs codes tournent avec quelques problèmes, mais ça va selon eux, et moi au labo, le même code n'affiche rien - ce qui est très normal sur leur source d'après la théorie que je maîtrise (mais pas eux), et je ne sais pas trop comment les noter, car ils n'ont pas été avertis en développant que leur code était incorrect.
Ne concluez pas trop vite que le problème est purement pédagogique ou que le labo est mieux installé. Le bug gcc que je vous signale marche très bien sur sofia aussi !
En espérant que vous saurez comprendre l'importance de ce problème (quelqu'en soit la raison effective ...). Catherine _______________________________________________ Systeme mailing list Systeme@lipn.univ-paris13.fr https://lipn.univ-paris13.fr/mailman/listinfo/systeme -- Emmanuel Viennet LIPN - Institut Galilee - Universite Paris-Nord
Catherine Recanati <Catherine.Recanati@lipn.univ-paris13.fr> disait recemment que :
Le compilateur des salles F206 et F207 (gcc ...) laisse passer des erreurs de syntaxe graves en C, en l'occurence, il ne nécessite pas qu'une variable soit déclarée en tête de bloc. (Je rappelle à ceux qui ne connaitraient pas bien C qu'un bloc en C (tout ce qui est entre accolades) est constitué de deux blocs successifs, un bloc de déclarations suivi d'un bloc d'instructions).
On peut dans cet environnement déclarer ses variables "au vol" comme en java. La seule chose qu'il controle apparemment est que la variable
SI j'ai bien compris, c'est un truc du genre : ------------------------------------------------------------------------ #include <stdio.h> main() { int i = 4; printf("i = %d\n", i); int j = 5; printf("j = %d\n", j); } ------------------------------------------------------------------------ SI j'en crois le man de gcc, ça semble être du a la compatibilité avec le C++ (gcc est également utilisé pour compiler le C++). Pour éviter d'avoir ce genre de "bug", il suffit d'utiliser l'option '-pedantic' (elle force la confirmité à la norme ISO C90) : ]>gcc -pedantic test1.c -o test1 test1.c: Dans la fonction « main »: test1.c:9: attention : ISO C90 forbids mixed declarations and code TH
Merci Thierry pour tes lumières. Ca vient evidemment du C++ et pas du java (je m'étais faite aussi la reflexion depuis mon mail ...) mais sur le fond, ça reste la même chose... As-tu une idée de ce qui peut causer le deuxième problème ? C'est sans doute du à autre chose, mais les codes générés sont substanciellement différents dans les deux environnements (l'environnement F206-7 génère des codes qui devraient planter et qui ont le mauvais goût de ne pas le faire! ; et j'ai bien conscience qu'il n'y a évidemment que moi pour trouver que c'est désavantageux !). Catherine Thierry Hamon a écrit :
Catherine Recanati <Catherine.Recanati@lipn.univ-paris13.fr> disait recemment que :
Le compilateur des salles F206 et F207 (gcc ...) laisse passer des erreurs de syntaxe graves en C, en l'occurence, il ne nécessite pas qu'une variable soit déclarée en tête de bloc. (Je rappelle à ceux qui ne connaitraient pas bien C qu'un bloc en C (tout ce qui est entre accolades) est constitué de deux blocs successifs, un bloc de déclarations suivi d'un bloc d'instructions).
On peut dans cet environnement déclarer ses variables "au vol" comme en java. La seule chose qu'il controle apparemment est que la variable
SI j'ai bien compris, c'est un truc du genre :
------------------------------------------------------------------------ #include <stdio.h>
main() {
int i = 4;
printf("i = %d\n", i);
int j = 5;
printf("j = %d\n", j);
} ------------------------------------------------------------------------
SI j'en crois le man de gcc, ça semble être du a la compatibilité avec le C++ (gcc est également utilisé pour compiler le C++).
Pour éviter d'avoir ce genre de "bug", il suffit d'utiliser l'option '-pedantic' (elle force la confirmité à la norme ISO C90) :
]>gcc -pedantic test1.c -o test1 test1.c: Dans la fonction « main »: test1.c:9: attention : ISO C90 forbids mixed declarations and code
TH
participants (3)
-
Catherine Recanati -
Emmanuel Viennet -
Thierry Hamon