Gilliek
28déc/103

Clang vs GCC

Mon ami Rolinh a déjà posté un billet sur une bizarrerie entre Clang et GCC. Eh bien hier soir, je suis tombé sur une autre assez spéciale.

Pour la petite histoire, j'aidais quelqu'un sur un forum et j'ai compilé son code avec Clang et avec Gcc et le résultat obtenue était différent.

Note : Ici, on ne s'intéresse pas à la qualité du code.

Voici le code :

int triplePointeur(int *pointeurSurNombre);

int main()
{
	int nombre = 5;
	triplePointeur(&nombre);
	printf("%d %dnn", nombre, triplePointeur(&nombre));

	return 0;
}

int triplePointeur(int *pointeurSurNombre)
{
	int a = 4;
	int b = 2;
	*pointeurSurNombre *= 3;
	return a + b;
}

Avec GCC ça donne :

$ gcc -Wall -o test test.c
$ ./test
45 6

On a une première modification de la variable nombre avec le premier appel de la fonction triplePointeur. On a 3 * 5 = 15. Ensuite, on réappelle triplePointeur dans le printf et on a donc  nombre = 3 * 15 = 45.

Et maintenant avec Clang :

$ clang -Wall -o test test.c
$ ./test
15 6

Et là, surprise, on obtient 15 !

Pour la réponse à cette énigme (voir commentaires, et au passage merci au posteur anaonyme) :

En fait, l'ordre de calcul des paramètres n'est pas défini dans le langage C. GCC calcule de droite à gauche, donc la variable nombre est modifiée deux fois. Quant à Clang, lui il les calcule de gauche de à droite. Du coup, nombre est affichée avant d'être modifiée une seconde fois.