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.

10déc/100

Citations de Coluche sur la politique

"La moitié des hommes politiques sont des bons à rien. Les autres sont prêts à tout."

"Technocrates, c'est les mecs que, quand tu leur poses une question, une fois qu'ils ont fini de répondre, tu comprends plus la question que t'as posée !"

"La politique, c'est pas compliqué, il suffit d'avoir une bonne conscience, et pour cela il faut juste avoir une mauvaise mémoire !"

"Le plus dur pour les hommes politiques, c'est d'avoir la mémoire qu'il faut pour se souvenir de ce qu'il ne faut pas dire."

"La dictature, c'est "ferme ta gueule" et la démocratie c'est "cause toujours"."

"Ca fait beaucoup marrer les gens de voir qu'on peut se moquer de la politique, alors que, dans l'ensemble, c'est surtout la politique qui se moque de nous."

C'est pas dur la politique comme métier ! Tu fais cinq ans de droit et tout le reste c'est de travers.

Remplis sous: Blagues Aucun commentaire
10déc/100

Ils sont fous ces scientifiques !


Blague dans un labo avec de l'air comprimé - Blog
9déc/100

Raisonnement naif

NOTE: Pardonnez la faute dans le titre (naif -> naïf), mais mon cher WordPress refuse de me mettre un "ï" ...

Il y a quelques temps de cela, je suis tombé par hasard sur un tutoriel en C qui parlait d'une bibliothèque (dirent, utilisée pour ouvrir/parcourir un répertoire). L'auteur, propose à un moment une fonction pour déterminer si l'élément courant est un répertoire ou un fichier :

int isDir(struct dirent* ent)
{
    if ((strchr(ent->d_name, '.')) == NULL) /* Si le nom du fichier n'a pas de point (une extension). */
        return 1;
    else
        return 0;
}

Je ne vous donne volontairement pas le lien vers le tutoriel. Mon but n'est pas de critiquer l'auteur ni son tutoriel (qui, soit dit en passant, est très bon hormis cette fonction), mais de mettre l'accent sur les "raisonnements naïfs" que peut avoir le programmeur.

Petite précision importante au passage : Ce tutoriel présente la bibliothèque pour GNU/Linux et Windows, en mettant quand même l'accent sur Linux.
Regardons maintenant ce bout de code de plus près !

Vous l'aurez sans doute remarqué, l'auteur propose de vérifier l'extension pour déterminer s'il s'agit d'un répertoire ou d'un fichier. Aïe ! En plus d'être absurde parce qu'on peut très bien mettre un point dans le nom d'un dossier (ex. : les dossiers cachés), les fichiers n'ont pas forcément d'extension (!) ...

Bref, il s'agit d'un raisonnemnt très naïf qui conduit souvent à de gros bugs dans un programme.

Moralité de l'histoire : bien réfléchir à ce qu'on fait et surtout connaître l'OS (Système d'exploitation) sur lequel on travaille.
Et comme je suis gentil (:-P), je vous mets une fonction correcte :

int
is_dir(const char *path)
{
	struct stat buf;

	if (stat(path,&buf) == -1){
		perror("Error ");
		return -1;
	}

	return S_ISDIR(buf.st_mode);
}

Et il faut inclure (en plus des libs "de base"):

sys/types.h
sys/stat.h
unistd.h

Je ne vous mets pas ces #include en entier parce que cet abruti de WordPress me les supprime (sans doute à cause des chevrons ...)

6déc/104

Matrix sous Windows XP !

J'adore cette vidéo !

( Merci à Kozu pour le lien ;-) )

Comme je ne peux pas inclure cette vidéo directement dans ce billet, je vous met le lien :

http://www.youtube.com/watch?v=yX8yrOAjfKM&feature=fvw

6déc/100

TCPDF, ton sauveur !

Si toi aussi tu en as mare de PDFlib, TCPDF est là pour toi ;-)

En tant que développeur Web, il m'est arrivé de devoir générer des PDF. Le problème étant que la plupart des hébergeurs ne propose que la version gratuite de PDFlib qui est une horreur sans nom (grrr). Mal pensé, mal documenté (et le exemples sont en Java ...) et en plus il est très limité en sa version gratuite ... je vous laisse imaginer la galère pour développer avec ...

Mais ces mauvais moments sont terminés, parce que TCPDF est là (<3) ! En effet, avec TCPDF, pas besoin d'installer quoique ce soit sur le serveur (ce qui aurait posé problème pour de l'hébergement mutualisé), il suffit de l'uploader sur le serveur et d'inclure  ce qu'il faut (avec include, require, etc). En plus, c'est beau parce qu'on met directement du code HTML. Concernant la documentation, sur le site on trouve de beaux exemples (en PHP!) clairs et utiles.