J'adore GCC ! C'est une collection de compilateurs pour de nombreux langages : C, ObjectiveC, C++, Java, Pascal, Ada, Fortran, etc. Il n'est peut être pas le compilateur le plus rapide (quoique...), mais celui qui supporte le plus d'architectures (processeurs et systèmes d'exploitation). Il permet d'ailleurs de compiler pour une architecture différente du système hôte (cross-compilation). Exemples : compiler depuis Linux pour Windows, compiler depuis Linux sur un processeur IA32 pour un ARM, etc. Je pense également qu'il respecte au plus près les standards (comme ISO C99).

Options -Wall -Wextra -Werror

Chaque nouvelle version de GCC détecte un peu plus de bugs. Ils sont soit rapportés sous forme d'avertissements, soit sous forme d'erreurs (bloque la compilation). Par expérience, je vous conseille d'activer tous les avertissements et de les corriger au plus tôt. L'option « -Wall » est censée activer tous les avertissements (vu son nom)... mais il existe « -Wextra » qui active encore plus d'avertissements ! Notez que -Wextra s'appellait « -W » tout court pour les versions inférieures à GCC 4.0. Si vous êtes pointilleux, vous pouvez utiliser « -Werror » qui va traduire les avertissements en erreur. Ceci oblige à corriger les avertissements sous peine de ne pas pouvoir compiler le programme.

Avec « -Wall -Wextra -Werror » on pourrait penser que GCC a fait de son mieux, mais que neni ! Il existe encore d'autres options « secrètes » comme par exemple l'option « -Wconversion » qui est pourtant utile : elle détecte les conversions de type dangereuses. Je pense que cette option est désactivée par défaut car elle produit beaucoup d'avertissements dont une bonne partie de faux positifs.

Détails de quelques options

Si je ne me trompe pas, les options suivantes sont toutes activées par « -Wall -Wextra ».

  • -Waddress détecte les comparaisons de pointeur (et non pas de la valeur pointée) comme dans « char *hello="Hello"; if (hello == "Hello") ... »
  • -Wuninitialized détecte l'utilisation de variable non initialisée : « char *x; printf("x=%s\n", x); »
  • -Wunused détecte les varibles inutiliséees : « void rien() { char x = 42; } »
  • -Wno-int-to-pointer-cast / -Wpointer-to-int-cast avertit des conversions implicites entre pointeur et entier : « void *x = NULL; int y = x; ». Ceci est problématique sur certaines architectures telle qu'AMD64 où un entier int fait 32 bits alors qu'un pointeur fait 64 bits !
  • -Wparentheses et -Wmissing-braces proposent d'ajouter des parenthèses / accolades pour du code prêtant à confusion
  • -Wformat détecte appels erronés à printf (argument manquant ou en trop, ou encore type incompatible) : « printf("Bonjour %s\n"); »

Notez que vous pouvez écrire « -Wno-(...) » pour désactiver un avertissement, comme par exemple : « -Wno-format ».

Lire également mon autre article sur GCC