-Wcast-align -Wwrite-strings -Wsign-compare
-Wunused
-Wno-unused-parameter
Tient, pourquoi donc ?
Moi, je suis plutôt pour la démarche.
void foo(int x, int y){
(void) y; // unused parameter, parce que blabla...
}
Cette remarque a déjà produit ses effets... Je partage complêtement
l'avis
de Harpo et Gabriel Dos Reis.
Je n'ai peut-etre pas bien lu, mais je n'ai pas vu qu'ils partagent
le même avis. Si j'ai bien compris, Gabriel préfère laisser raler le
compilo, et Harpo (si j'ai bien compris le message du 21 juin) ne
juge pas choquant le (void).
De plus, j'avoue ne pas avoir réussi à comprendre la motivation
de Gabriel (et cela m'arrive souvent). Ton avis pourrait m'interesser
(ceci dit, vu que je vais etre hors news pendant une semaine,
poser des questions dont je ne pourrais pas lire la réponse
avant 8 jours, est-ce très poli ?).
Le plus important dans toutes ces options, c'est -Werror ;-)
Je ne l'utilise pas parce que je lis toujours mes warning,
mais dans un contexte de longue chaine de compilation, j'imagine
que c'est différent.
-Wcast-align -Wwrite-strings -Wsign-compare
-Wunused
-Wno-unused-parameter
Tient, pourquoi donc ?
Moi, je suis plutôt pour la démarche.
void foo(int x, int y){
(void) y; // unused parameter, parce que blabla...
}
Cette remarque a déjà produit ses effets... Je partage complêtement
l'avis
de Harpo et Gabriel Dos Reis.
Je n'ai peut-etre pas bien lu, mais je n'ai pas vu qu'ils partagent
le même avis. Si j'ai bien compris, Gabriel préfère laisser raler le
compilo, et Harpo (si j'ai bien compris le message du 21 juin) ne
juge pas choquant le (void).
De plus, j'avoue ne pas avoir réussi à comprendre la motivation
de Gabriel (et cela m'arrive souvent). Ton avis pourrait m'interesser
(ceci dit, vu que je vais etre hors news pendant une semaine,
poser des questions dont je ne pourrais pas lire la réponse
avant 8 jours, est-ce très poli ?).
Le plus important dans toutes ces options, c'est -Werror ;-)
Je ne l'utilise pas parce que je lis toujours mes warning,
mais dans un contexte de longue chaine de compilation, j'imagine
que c'est différent.
-Wcast-align -Wwrite-strings -Wsign-compare
-Wunused
-Wno-unused-parameter
Tient, pourquoi donc ?
Moi, je suis plutôt pour la démarche.
void foo(int x, int y){
(void) y; // unused parameter, parce que blabla...
}
Cette remarque a déjà produit ses effets... Je partage complêtement
l'avis
de Harpo et Gabriel Dos Reis.
Je n'ai peut-etre pas bien lu, mais je n'ai pas vu qu'ils partagent
le même avis. Si j'ai bien compris, Gabriel préfère laisser raler le
compilo, et Harpo (si j'ai bien compris le message du 21 juin) ne
juge pas choquant le (void).
De plus, j'avoue ne pas avoir réussi à comprendre la motivation
de Gabriel (et cela m'arrive souvent). Ton avis pourrait m'interesser
(ceci dit, vu que je vais etre hors news pendant une semaine,
poser des questions dont je ne pourrais pas lire la réponse
avant 8 jours, est-ce très poli ?).
Le plus important dans toutes ces options, c'est -Werror ;-)
Je ne l'utilise pas parce que je lis toujours mes warning,
mais dans un contexte de longue chaine de compilation, j'imagine
que c'est différent.
"Charlie Gordon" writes:
[...]
| C'est plutôt une limitation stupide du compilateur si on ne peut pas
| désactiver sélectivement chaque type de warning.
Dans la version experimentale de GCC, il est possible de desactiver
les warnings selectivement.
"Charlie Gordon" <news@chqrlie.org> writes:
[...]
| C'est plutôt une limitation stupide du compilateur si on ne peut pas
| désactiver sélectivement chaque type de warning.
Dans la version experimentale de GCC, il est possible de desactiver
les warnings selectivement.
"Charlie Gordon" writes:
[...]
| C'est plutôt une limitation stupide du compilateur si on ne peut pas
| désactiver sélectivement chaque type de warning.
Dans la version experimentale de GCC, il est possible de desactiver
les warnings selectivement.
Marc Espie a écrit dans le message de news:
f5iup0$2ukk$In article <467cd247$0$11886$,
Charlie Gordon wrote:La réponse à cette question en ce qui concerne strnpy est simple :
- comment utiliser strncpy ? -> *IL NE FAUT PAS*
C'est faux.
Si c'est vrai. Dans les cas que tu mentionnes ci-dessous, on aurait
intérêt à utiliser une fonction spécifique qui retourne l'information
utile,
à savoir si la chaine passée en source est d'une longueur
supérieure à celle du buffer destination.
Si on connait déjà la longueur de la chaine,
<couic>
- que fait strncpy ? -> explication détaillée du comportement
pervers de cette fonction inutile.
C'est faux egalement, strncpy n'est pas totalement inutile.
Cette fonction sert exactement dans un cas de figure (plutot limite):
celui des enregistrements limites en taille en memoire, et qui ne
sont pas forcement termines par des zeros.
Il en existe sur au moins les systemes Unix. Par exemple, la
structure utmp est de ce type. Et les noms de fichiers dans les
archives ar(1) possedent aussi des caracteristiques etranges. C'est
d'ailleurs assez souvent le cas dans les formats d'archive un peu
compacts: on va jusqu'au bout d'un champ texte, quitte a virer le
zero final.
Je te l'accorde, c'est un cas extremement rare.
Et ca n'est pas sur que strncpy produise le code le plus simple
a relire
(surtout par
manque de familiarite d'une bonne partie des gens avec ce type de
construction), mais ce n'est pas une fonction `totalement inutile'.
Tu as décrit les raisons historiques qui ont produit cette fonction
bâtarde.
Il eut été préférable de ne pas l'inclure dans la librairie
C à l'époque (c'est très ancien, 1976?) et en tous cas de ne pas la
normer en 1986. Après tout l'ANSI a supprimé à l'époque tout ce qui
concernait Unix de trop près (I/O et autres appels système), ils
auraient dû aussi virer strncpy qui n'était utilisée correctement que
dans les drivers de système de fichier et autres utilitaires système.
et les cas où elle est utilisée à mauvais escient et avec
pratiquement toujours des conséquences fâcheuses sont légion.
Marc Espie a écrit dans le message de news:
f5iup0$2ukk$3@biggoron.nerim.net...
In article <467cd247$0$11886$426a74cc@news.free.fr>,
Charlie Gordon wrote:
La réponse à cette question en ce qui concerne strnpy est simple :
- comment utiliser strncpy ? -> *IL NE FAUT PAS*
C'est faux.
Si c'est vrai. Dans les cas que tu mentionnes ci-dessous, on aurait
intérêt à utiliser une fonction spécifique qui retourne l'information
utile,
à savoir si la chaine passée en source est d'une longueur
supérieure à celle du buffer destination.
Si on connait déjà la longueur de la chaine,
<couic>
- que fait strncpy ? -> explication détaillée du comportement
pervers de cette fonction inutile.
C'est faux egalement, strncpy n'est pas totalement inutile.
Cette fonction sert exactement dans un cas de figure (plutot limite):
celui des enregistrements limites en taille en memoire, et qui ne
sont pas forcement termines par des zeros.
Il en existe sur au moins les systemes Unix. Par exemple, la
structure utmp est de ce type. Et les noms de fichiers dans les
archives ar(1) possedent aussi des caracteristiques etranges. C'est
d'ailleurs assez souvent le cas dans les formats d'archive un peu
compacts: on va jusqu'au bout d'un champ texte, quitte a virer le
zero final.
Je te l'accorde, c'est un cas extremement rare.
Et ca n'est pas sur que strncpy produise le code le plus simple
a relire
(surtout par
manque de familiarite d'une bonne partie des gens avec ce type de
construction), mais ce n'est pas une fonction `totalement inutile'.
Tu as décrit les raisons historiques qui ont produit cette fonction
bâtarde.
Il eut été préférable de ne pas l'inclure dans la librairie
C à l'époque (c'est très ancien, 1976?) et en tous cas de ne pas la
normer en 1986. Après tout l'ANSI a supprimé à l'époque tout ce qui
concernait Unix de trop près (I/O et autres appels système), ils
auraient dû aussi virer strncpy qui n'était utilisée correctement que
dans les drivers de système de fichier et autres utilitaires système.
et les cas où elle est utilisée à mauvais escient et avec
pratiquement toujours des conséquences fâcheuses sont légion.
Marc Espie a écrit dans le message de news:
f5iup0$2ukk$In article <467cd247$0$11886$,
Charlie Gordon wrote:La réponse à cette question en ce qui concerne strnpy est simple :
- comment utiliser strncpy ? -> *IL NE FAUT PAS*
C'est faux.
Si c'est vrai. Dans les cas que tu mentionnes ci-dessous, on aurait
intérêt à utiliser une fonction spécifique qui retourne l'information
utile,
à savoir si la chaine passée en source est d'une longueur
supérieure à celle du buffer destination.
Si on connait déjà la longueur de la chaine,
<couic>
- que fait strncpy ? -> explication détaillée du comportement
pervers de cette fonction inutile.
C'est faux egalement, strncpy n'est pas totalement inutile.
Cette fonction sert exactement dans un cas de figure (plutot limite):
celui des enregistrements limites en taille en memoire, et qui ne
sont pas forcement termines par des zeros.
Il en existe sur au moins les systemes Unix. Par exemple, la
structure utmp est de ce type. Et les noms de fichiers dans les
archives ar(1) possedent aussi des caracteristiques etranges. C'est
d'ailleurs assez souvent le cas dans les formats d'archive un peu
compacts: on va jusqu'au bout d'un champ texte, quitte a virer le
zero final.
Je te l'accorde, c'est un cas extremement rare.
Et ca n'est pas sur que strncpy produise le code le plus simple
a relire
(surtout par
manque de familiarite d'une bonne partie des gens avec ce type de
construction), mais ce n'est pas une fonction `totalement inutile'.
Tu as décrit les raisons historiques qui ont produit cette fonction
bâtarde.
Il eut été préférable de ne pas l'inclure dans la librairie
C à l'époque (c'est très ancien, 1976?) et en tous cas de ne pas la
normer en 1986. Après tout l'ANSI a supprimé à l'époque tout ce qui
concernait Unix de trop près (I/O et autres appels système), ils
auraient dû aussi virer strncpy qui n'était utilisée correctement que
dans les drivers de système de fichier et autres utilitaires système.
et les cas où elle est utilisée à mauvais escient et avec
pratiquement toujours des conséquences fâcheuses sont légion.
Sans compter tous les cas ou gcc
s'emmele les pinceaux dans un algorithme un peu complexe, et m'informe
que telle variable n'est pas forcement initialisee (alors qu'elle l'est),
ce qui m'obligerait, pour passer le cap du -Werror, a rajouter une
affectation totalement inutile...
Sans compter tous les cas ou gcc
s'emmele les pinceaux dans un algorithme un peu complexe, et m'informe
que telle variable n'est pas forcement initialisee (alors qu'elle l'est),
ce qui m'obligerait, pour passer le cap du -Werror, a rajouter une
affectation totalement inutile...
Sans compter tous les cas ou gcc
s'emmele les pinceaux dans un algorithme un peu complexe, et m'informe
que telle variable n'est pas forcement initialisee (alors qu'elle l'est),
ce qui m'obligerait, pour passer le cap du -Werror, a rajouter une
affectation totalement inutile...
Marc Espie - <f5o5iv$1olh$ :Sans compter tous les cas ou gcc
s'emmele les pinceaux dans un algorithme un peu complexe, et m'informe
que telle variable n'est pas forcement initialisee (alors qu'elle l'est),
ce qui m'obligerait, pour passer le cap du -Werror, a rajouter une
affectation totalement inutile...
Elle est affectée ou pas, la variable?
Marc Espie - <f5o5iv$1olh$1@biggoron.nerim.net> :
Sans compter tous les cas ou gcc
s'emmele les pinceaux dans un algorithme un peu complexe, et m'informe
que telle variable n'est pas forcement initialisee (alors qu'elle l'est),
ce qui m'obligerait, pour passer le cap du -Werror, a rajouter une
affectation totalement inutile...
Elle est affectée ou pas, la variable?
Marc Espie - <f5o5iv$1olh$ :Sans compter tous les cas ou gcc
s'emmele les pinceaux dans un algorithme un peu complexe, et m'informe
que telle variable n'est pas forcement initialisee (alors qu'elle l'est),
ce qui m'obligerait, pour passer le cap du -Werror, a rajouter une
affectation totalement inutile...
Elle est affectée ou pas, la variable?
Voici un exemple de ce que gcc ne sait pas reconnaitre:
void func(int n) {
int i;
int j; /* variable non initialisée */
for (i = 0; i < 100; i++) {
do_something_complicated(i);
if (n == 0)
j = do_something_else(i);
do_some_more_stuff(i);
}
if (n == 0)
return j;
return 0;
}
Comme tu peux le voir, j n'est utilisé que si n est nul, [...]
Dans des cas extrêmes, ces initialisations peuvent ralentir un micro chouia
une boucle interne super optimisée à l'huile de poignet.
Voici un exemple de ce que gcc ne sait pas reconnaitre:
void func(int n) {
int i;
int j; /* variable non initialisée */
for (i = 0; i < 100; i++) {
do_something_complicated(i);
if (n == 0)
j = do_something_else(i);
do_some_more_stuff(i);
}
if (n == 0)
return j;
return 0;
}
Comme tu peux le voir, j n'est utilisé que si n est nul, [...]
Dans des cas extrêmes, ces initialisations peuvent ralentir un micro chouia
une boucle interne super optimisée à l'huile de poignet.
Voici un exemple de ce que gcc ne sait pas reconnaitre:
void func(int n) {
int i;
int j; /* variable non initialisée */
for (i = 0; i < 100; i++) {
do_something_complicated(i);
if (n == 0)
j = do_something_else(i);
do_some_more_stuff(i);
}
if (n == 0)
return j;
return 0;
}
Comme tu peux le voir, j n'est utilisé que si n est nul, [...]
Dans des cas extrêmes, ces initialisations peuvent ralentir un micro chouia
une boucle interne super optimisée à l'huile de poignet.
Charlie Gordon wrote on 26/06/2007 01:20:
Voici un exemple de ce que gcc ne sait pas reconnaitre:
void func(int n) {
int i;
int j; /* variable non initialisée */
for (i = 0; i < 100; i++) {
do_something_complicated(i);
if (n == 0)
j = do_something_else(i);
do_some_more_stuff(i);
}
if (n == 0)
return j;
return 0;
}
Comme tu peux le voir, j n'est utilisé que si n est nul, [...]
Dans des cas extrêmes, ces initialisations peuvent ralentir un micro
chouia une boucle interne super optimisée à l'huile de poignet.
pourquoi, dans un tel cas, l'huile de poignet ne tapote pas :
void func(int n) {
int i;
int retCode = 0; /* or int retCode; */
if (0 == n){
for (i = 0; i < 100; i++) {
do_something_complicated(i);
retCode = do_something_else(i);
do_some_more_stuff(i);
}
}
else {
for (i = 0; i < 100; i++) {
do_something_complicated(i);
do_some_more_stuff(i);
/* retCode = 0; */ /* depending on initial def. */
}
}
return retCode;
}
placer des tests invariants dans des boucles ne m'a paru élégant.
Charlie Gordon wrote on 26/06/2007 01:20:
Voici un exemple de ce que gcc ne sait pas reconnaitre:
void func(int n) {
int i;
int j; /* variable non initialisée */
for (i = 0; i < 100; i++) {
do_something_complicated(i);
if (n == 0)
j = do_something_else(i);
do_some_more_stuff(i);
}
if (n == 0)
return j;
return 0;
}
Comme tu peux le voir, j n'est utilisé que si n est nul, [...]
Dans des cas extrêmes, ces initialisations peuvent ralentir un micro
chouia une boucle interne super optimisée à l'huile de poignet.
pourquoi, dans un tel cas, l'huile de poignet ne tapote pas :
void func(int n) {
int i;
int retCode = 0; /* or int retCode; */
if (0 == n){
for (i = 0; i < 100; i++) {
do_something_complicated(i);
retCode = do_something_else(i);
do_some_more_stuff(i);
}
}
else {
for (i = 0; i < 100; i++) {
do_something_complicated(i);
do_some_more_stuff(i);
/* retCode = 0; */ /* depending on initial def. */
}
}
return retCode;
}
placer des tests invariants dans des boucles ne m'a paru élégant.
Charlie Gordon wrote on 26/06/2007 01:20:
Voici un exemple de ce que gcc ne sait pas reconnaitre:
void func(int n) {
int i;
int j; /* variable non initialisée */
for (i = 0; i < 100; i++) {
do_something_complicated(i);
if (n == 0)
j = do_something_else(i);
do_some_more_stuff(i);
}
if (n == 0)
return j;
return 0;
}
Comme tu peux le voir, j n'est utilisé que si n est nul, [...]
Dans des cas extrêmes, ces initialisations peuvent ralentir un micro
chouia une boucle interne super optimisée à l'huile de poignet.
pourquoi, dans un tel cas, l'huile de poignet ne tapote pas :
void func(int n) {
int i;
int retCode = 0; /* or int retCode; */
if (0 == n){
for (i = 0; i < 100; i++) {
do_something_complicated(i);
retCode = do_something_else(i);
do_some_more_stuff(i);
}
}
else {
for (i = 0; i < 100; i++) {
do_something_complicated(i);
do_some_more_stuff(i);
/* retCode = 0; */ /* depending on initial def. */
}
}
return retCode;
}
placer des tests invariants dans des boucles ne m'a paru élégant.
Parce que le code en question n'était là que pour illustrer un cas où gcc
produit un warning apparemment injustifié (encore que je n'aie pas vérifié,
j'ai improvisé ces lignes au hasard).
Encore sur l'élégance : 0 == n est une faute de goût qui détonne.
Pourquoi ignorer les conventions de nommages apparentes dans ces quelques
lignes ?
D'ailleurs pourquoi retCode ? ce n'est pas un code, tout au plus une value.
Parce que le code en question n'était là que pour illustrer un cas où gcc
produit un warning apparemment injustifié (encore que je n'aie pas vérifié,
j'ai improvisé ces lignes au hasard).
Encore sur l'élégance : 0 == n est une faute de goût qui détonne.
Pourquoi ignorer les conventions de nommages apparentes dans ces quelques
lignes ?
D'ailleurs pourquoi retCode ? ce n'est pas un code, tout au plus une value.
Parce que le code en question n'était là que pour illustrer un cas où gcc
produit un warning apparemment injustifié (encore que je n'aie pas vérifié,
j'ai improvisé ces lignes au hasard).
Encore sur l'élégance : 0 == n est une faute de goût qui détonne.
Pourquoi ignorer les conventions de nommages apparentes dans ces quelques
lignes ?
D'ailleurs pourquoi retCode ? ce n'est pas un code, tout au plus une value.