| void foo(int x, int y)
| {
|
| if (0 != y)
| {
| abort_retry_cancel("param y (%d) must be 0n", y);
| }
|
| /* et maintenant du code qui fait des choses */
| }
|
Pourquoi insister a aller au dela du code simple et correct ?
Si "y" ne contribue pas a la semantique de la fonction, pourquoi
insister a l'utiliser ?
En fait, c'est assez lié à mon contexte personnel. Je fais
| void foo(int x, int y)
| {
|
| if (0 != y)
| {
| abort_retry_cancel("param y (%d) must be 0n", y);
| }
|
| /* et maintenant du code qui fait des choses */
| }
|
Pourquoi insister a aller au dela du code simple et correct ?
Si "y" ne contribue pas a la semantique de la fonction, pourquoi
insister a l'utiliser ?
En fait, c'est assez lié à mon contexte personnel. Je fais
| void foo(int x, int y)
| {
|
| if (0 != y)
| {
| abort_retry_cancel("param y (%d) must be 0n", y);
| }
|
| /* et maintenant du code qui fait des choses */
| }
|
Pourquoi insister a aller au dela du code simple et correct ?
Si "y" ne contribue pas a la semantique de la fonction, pourquoi
insister a l'utiliser ?
En fait, c'est assez lié à mon contexte personnel. Je fais
En fait j'ai du mal avec 0 != y parce que je lis de grandes quantités de
code, pour des revues de qualification, et je trouve cela illisible.
J'accorde beaucoup d'importance à la formulation du code : ce qui se conçoit
bien s'énonce clairement. Or dans le cas présent, le test se lit : "la
valeur de 0 est elle y à cet instant ?"
En fait j'ai du mal avec 0 != y parce que je lis de grandes quantités de
code, pour des revues de qualification, et je trouve cela illisible.
J'accorde beaucoup d'importance à la formulation du code : ce qui se conçoit
bien s'énonce clairement. Or dans le cas présent, le test se lit : "la
valeur de 0 est elle y à cet instant ?"
En fait j'ai du mal avec 0 != y parce que je lis de grandes quantités de
code, pour des revues de qualification, et je trouve cela illisible.
J'accorde beaucoup d'importance à la formulation du code : ce qui se conçoit
bien s'énonce clairement. Or dans le cas présent, le test se lit : "la
valeur de 0 est elle y à cet instant ?"
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.
- 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'.
In article <467cd247$0$11886$426a74cc@news.free.fr>,
Charlie Gordon <news@chqrlie.org> wrote:
La réponse à cette question en ce qui concerne strnpy est simple :
- comment utiliser strncpy ? -> *IL NE FAUT PAS*
C'est faux.
- 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'.
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.
- 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'.
--{ Charlie Gordon a plopé ceci: }--En fait j'ai du mal avec 0 != y parce que je lis de grandes quantités de
code, pour des revues de qualification, et je trouve cela illisible.
Ah ? C'est donc une mauvaise habitude ? Pourtant, ça m'a parfois
préservé de quelques belles bétises pénibles à retrouver...
J'accorde beaucoup d'importance à la formulation du code : ce qui se
conçoit
bien s'énonce clairement. Or dans le cas présent, le test se lit : "la
valeur de 0 est elle y à cet instant ?"
"la valeur 0 est-elle _celle de_ y à cet instant ?"
--{ Charlie Gordon a plopé ceci: }--
En fait j'ai du mal avec 0 != y parce que je lis de grandes quantités de
code, pour des revues de qualification, et je trouve cela illisible.
Ah ? C'est donc une mauvaise habitude ? Pourtant, ça m'a parfois
préservé de quelques belles bétises pénibles à retrouver...
J'accorde beaucoup d'importance à la formulation du code : ce qui se
conçoit
bien s'énonce clairement. Or dans le cas présent, le test se lit : "la
valeur de 0 est elle y à cet instant ?"
"la valeur 0 est-elle _celle de_ y à cet instant ?"
--{ Charlie Gordon a plopé ceci: }--En fait j'ai du mal avec 0 != y parce que je lis de grandes quantités de
code, pour des revues de qualification, et je trouve cela illisible.
Ah ? C'est donc une mauvaise habitude ? Pourtant, ça m'a parfois
préservé de quelques belles bétises pénibles à retrouver...
J'accorde beaucoup d'importance à la formulation du code : ce qui se
conçoit
bien s'énonce clairement. Or dans le cas présent, le test se lit : "la
valeur de 0 est elle y à cet instant ?"
"la valeur 0 est-elle _celle de_ y à cet instant ?"
--{ Gabriel Dos Reis a plopé ceci: }--| void foo(int x, int y)
| {
|
| if (0 != y)
| {
| abort_retry_cancel("param y (%d) must be 0n", y);
| }
|
| /* et maintenant du code qui fait des choses */
| }
|
Pourquoi insister a aller au dela du code simple et correct ?
Si "y" ne contribue pas a la semantique de la fonction, pourquoi
insister a l'utiliser ?
En fait, c'est assez lié à mon contexte personnel. Je fais
pas mal de C pour bricoler des images. Il m'arrive parfois
d'imaginer un traitement, de le coder à la rache, tout en
sachant bien que plus tard, j'aimerais bien lui passer
un paramètre ou un flag supplémentaire.
Comme toutes mes fonctions de traitement sont dans une
kludgesque bibliothèque en .so, et que les petits machins
de traitement sont éparpillés aux quatre coins des disques,
j'essaye de me protéger des coredumps quand les signatures
ne concordent pas...
Je sais, c'est du bricolage, désolé :)
--{ Gabriel Dos Reis a plopé ceci: }--
| void foo(int x, int y)
| {
|
| if (0 != y)
| {
| abort_retry_cancel("param y (%d) must be 0n", y);
| }
|
| /* et maintenant du code qui fait des choses */
| }
|
Pourquoi insister a aller au dela du code simple et correct ?
Si "y" ne contribue pas a la semantique de la fonction, pourquoi
insister a l'utiliser ?
En fait, c'est assez lié à mon contexte personnel. Je fais
pas mal de C pour bricoler des images. Il m'arrive parfois
d'imaginer un traitement, de le coder à la rache, tout en
sachant bien que plus tard, j'aimerais bien lui passer
un paramètre ou un flag supplémentaire.
Comme toutes mes fonctions de traitement sont dans une
kludgesque bibliothèque en .so, et que les petits machins
de traitement sont éparpillés aux quatre coins des disques,
j'essaye de me protéger des coredumps quand les signatures
ne concordent pas...
Je sais, c'est du bricolage, désolé :)
--{ Gabriel Dos Reis a plopé ceci: }--| void foo(int x, int y)
| {
|
| if (0 != y)
| {
| abort_retry_cancel("param y (%d) must be 0n", y);
| }
|
| /* et maintenant du code qui fait des choses */
| }
|
Pourquoi insister a aller au dela du code simple et correct ?
Si "y" ne contribue pas a la semantique de la fonction, pourquoi
insister a l'utiliser ?
En fait, c'est assez lié à mon contexte personnel. Je fais
pas mal de C pour bricoler des images. Il m'arrive parfois
d'imaginer un traitement, de le coder à la rache, tout en
sachant bien que plus tard, j'aimerais bien lui passer
un paramètre ou un flag supplémentaire.
Comme toutes mes fonctions de traitement sont dans une
kludgesque bibliothèque en .so, et que les petits machins
de traitement sont éparpillés aux quatre coins des disques,
j'essaye de me protéger des coredumps quand les signatures
ne concordent pas...
Je sais, c'est du bricolage, désolé :)
"Thierry B." a écrit dans le message de news:
if (y == FIRST_CASE) {
do something
"Thierry B." <tth@prout.stex> a écrit dans le message de news:
udf0l4-7je.ln1@prout.stex...
if (y == FIRST_CASE) {
do something
"Thierry B." a écrit dans le message de news:
if (y == FIRST_CASE) {
do something
Est-ce raisonnable ? Est-ce que ça ne laisse pas le programmeur se
reposer sur le fait que les char sont non signés ? Ne vaut il mieux
pas le forcer à précier le signe des char à chaque usage ?
D'une part les char signés par défaut sont une abérration historique qui est
notoirement incohérente avec la sémantique de certaines fonctions de la lib
C :
D'autre part, dans le code produit chez nous, nous réservons le type char,
et en particulier char * aux chaines de caractères textuelles,
[SNIP]
Je prends le risque que notre code ne soit pas portable sur des
environnements ou les char sont forcément signés par défaut. Je ne pense
pas que ce soit un risque réel, de telles cibles auront vraisemblablement
d'autres problèmes de portabilité bien plus lourds.
-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.
Le plus important dans toutes ces options, c'est -Werror ;-)
Est-ce raisonnable ? Est-ce que ça ne laisse pas le programmeur se
reposer sur le fait que les char sont non signés ? Ne vaut il mieux
pas le forcer à précier le signe des char à chaque usage ?
D'une part les char signés par défaut sont une abérration historique qui est
notoirement incohérente avec la sémantique de certaines fonctions de la lib
C :
D'autre part, dans le code produit chez nous, nous réservons le type char,
et en particulier char * aux chaines de caractères textuelles,
[SNIP]
Je prends le risque que notre code ne soit pas portable sur des
environnements ou les char sont forcément signés par défaut. Je ne pense
pas que ce soit un risque réel, de telles cibles auront vraisemblablement
d'autres problèmes de portabilité bien plus lourds.
-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.
Le plus important dans toutes ces options, c'est -Werror ;-)
Est-ce raisonnable ? Est-ce que ça ne laisse pas le programmeur se
reposer sur le fait que les char sont non signés ? Ne vaut il mieux
pas le forcer à précier le signe des char à chaque usage ?
D'une part les char signés par défaut sont une abérration historique qui est
notoirement incohérente avec la sémantique de certaines fonctions de la lib
C :
D'autre part, dans le code produit chez nous, nous réservons le type char,
et en particulier char * aux chaines de caractères textuelles,
[SNIP]
Je prends le risque que notre code ne soit pas portable sur des
environnements ou les char sont forcément signés par défaut. Je ne pense
pas que ce soit un risque réel, de telles cibles auront vraisemblablement
d'autres problèmes de portabilité bien plus lourds.
-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.
Le plus important dans toutes ces options, c'est -Werror ;-)
"Charlie Gordon" a écrit dans le message de
news:467e3589$0$12382$"Thierry B." a écrit dans le message de news:
if (y == FIRST_CASE) {
do something
L'avantage de l'écriture if (FIRST_CASE==y)
est de detecter l'erreur de frappe if (y = FIRST_CASE).
"Charlie Gordon" <news@chqrlie.org> a écrit dans le message de
news:467e3589$0$12382$426a74cc@news.free.fr...
"Thierry B." <tth@prout.stex> a écrit dans le message de news:
udf0l4-7je.ln1@prout.stex...
if (y == FIRST_CASE) {
do something
L'avantage de l'écriture if (FIRST_CASE==y)
est de detecter l'erreur de frappe if (y = FIRST_CASE).
"Charlie Gordon" a écrit dans le message de
news:467e3589$0$12382$"Thierry B." a écrit dans le message de news:
if (y == FIRST_CASE) {
do something
L'avantage de l'écriture if (FIRST_CASE==y)
est de detecter l'erreur de frappe if (y = FIRST_CASE).
Oui, je sais bien pourquoi cet idiome hideux est utile, mais il existe des
outils bien plus efficaces pour détecter ces fautes de frappe et aussi des
erreurs plus subtiles comme les confusions sur la précédence des opérateurs.
Tous les compilateurs modernes ont des options pour produire des warnings
sur ce genre de choses. C'est évidemment un scandale que ces avertissements
ne soient pas actifs par défaut, mais en les activant et en traitant
systématiquement les warnings (-Werror empêche de les ignorer ;-) on règle
ces problèmes sans avoir à écrire du code illisible.
gcc -Wall -W -Werror est un bon début.
Oui, je sais bien pourquoi cet idiome hideux est utile, mais il existe des
outils bien plus efficaces pour détecter ces fautes de frappe et aussi des
erreurs plus subtiles comme les confusions sur la précédence des opérateurs.
Tous les compilateurs modernes ont des options pour produire des warnings
sur ce genre de choses. C'est évidemment un scandale que ces avertissements
ne soient pas actifs par défaut, mais en les activant et en traitant
systématiquement les warnings (-Werror empêche de les ignorer ;-) on règle
ces problèmes sans avoir à écrire du code illisible.
gcc -Wall -W -Werror est un bon début.
Oui, je sais bien pourquoi cet idiome hideux est utile, mais il existe des
outils bien plus efficaces pour détecter ces fautes de frappe et aussi des
erreurs plus subtiles comme les confusions sur la précédence des opérateurs.
Tous les compilateurs modernes ont des options pour produire des warnings
sur ce genre de choses. C'est évidemment un scandale que ces avertissements
ne soient pas actifs par défaut, mais en les activant et en traitant
systématiquement les warnings (-Werror empêche de les ignorer ;-) on règle
ces problèmes sans avoir à écrire du code illisible.
gcc -Wall -W -Werror est un bon début.