OVH Cloud OVH Cloud

Warning sur l'évaluation d'une expression de type pointeur de fonction ("opera tion may be undefined")

23 réponses
Avatar
Xavier Roche
Bonsoir à tous,

Soit le petit programme suvant:

static void bar(void) {}
int main(void) {
void (*my_bar)(void);
(my_bar = bar, my_bar)();
return 0;
}

gcc me dit gentiment:
1.c:8: warning: operation on `my_bar' may be undefined

Question: en quoi la ligne "(my_bar = bar, my_bar)()" est-elle ambigüe ?
J'ai beau ouvrir grand mes yeux à cette heure tardive, je ne vois pas.

3 réponses

1 2 3
Avatar
Jean-Claude Arbaut
Xavier Roche wrote:

Donc, tu essaies d'appeler avec l'ancien my_bar qui n'est
pas encore initialisé.



Qui n'est /peut être/ ("MAY be undefined") pas encore initialisé.

Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre
d'execution entre les "," et le compilateur peut évaluer la partie
droite avant d'executer la gauche, si j'ai bien tout pigé.


C'est un effet de bord, "normalement" (s'il n'y avait pas
cette affectation), my_bar ne devrait pas être initialisé,
et je ne sais pas ce qu'en dit le standard.

C'est donc le même problème qu'avec l'évaluation des arguments d'une
fonction (qui peut se faire dans un ordre totalement arbitraire), hélas.


Je pense que oui, il ne faut jamais faire mumuse avec
les effets de bords ;-)


Avatar
Côme Desplats
Xavier Roche wrote:
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre
d'execution entre les ","


Bon en fait ce n'est pas ça, l'opérateur "séquentiel" (le ",") est
bien.. séquentiel, donc pas de problème d'ordre. Je n'ai pas trouvé la
spec exacte, mais il semble bien qu'il n'y ait pas de problème avec
l'ordre d'évaluation. (1)

D'ailleurs, le code:
char foo[42] = "foo!";
char *bar;
*(bar = foo, bar) = 0;
ne pose pas de problème .

Et donc pas normal que l'exemple plus haut donne des boutons à gcc. Il y
aurait-il une subtilité lié au pointeur de fonction ?

(1)

"Comma expressions"
<http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/co.htm>


Il est indiqué dans cette doc que "The result of a comma expression is
not an lvalue." Le warning est peut-être lié à ceci.


Avatar
Xavier Roche
Il est indiqué dans cette doc que "The result of a comma expression is
not an lvalue."


Non plus, on est pas dans le cas d'une lvalue (c'est à dire qu'on n'est
pas dans un cas où l'on fait: (a = 42, foo) = bar)

1 2 3