Skip to content

Bad Coding Practices ( C language)

Oussama Ben Khiroun edited this page Nov 3, 2018 · 3 revisions

Ceci est une liste non exhaustive de mauvaises pratiques de programmation en langage C.

La norme ANSI-C (dite aussi norme C-89) est la norme recommandée.

1. Déclaration de variable lors de l'utilisation des blocs d'instructions

En langage C (norme ANSI-C dite aussi C-89), il est interdit de déclarer le type du compteur dans la boucle for.

Ceci est accepté dans le langage C++ (voire la norme C-99) et peut passer durant la compilation sur votre machine.

for (int i; i<10; i++){   //interdit en norme ANSI-C

Les variables doivent être déclarées en premier lieu avant d'être utilisées.

2. Déclaration de tableau avec une taille variable

   int n=100;
   int Tab[n];  //interdit en C (norme ANSI-C)

/* la taille d'un tableau statique doit être connue depuis la phase de compilation;
   une constante peut être utilisée également pour définir la capacité du tableau. */
   int Tab[100];

3. Utilisation de type booléen

En C, il n'existe pas de type booléen. L'utilisation de la bibliothèque <stdbool.h> est permise en norme C-99.

Cependant, ceci est non conforme à la norme ANSI-C.

4. Utilisation des chaînes de caractères

En C, une chaîne de caractères est déclarée en tant que tableau de caractères.

⚠️ Le dernier caractère du tableau doit être '\0'.

// exemples avec initialisation
char ch1[] = "abcd";  // la taille du tableau sera = 5
   // ou
char ch2[5] = "abcd";  // dernier caractère '\0'
   // ou
char ch3[] = {'a', 'b', 'c', 'd', '\0'};

// exemple sans initialisation
char ch4[20];      // au maximum la longueur de la chaîne sera = 20
scanf("%s", ch4);  // lit les caractères sur une ligne jusqu'à rencontre du premier espace (pareil pour lecture du fichier avec "fscanf")
gets(ch4);         // lit la totalité de ligne; même si la ligne contient un ou plusieurs espaces (pareil pour lecture du fichier avec "fgets")

🚫 Le type string est propre au langage C++ !

5. Utilisation de getchar en fin du programme

Eviter l'utilisation de getchar() (attente de saisie d'un caractère pour sortir de la console) en fin du programme main.

Ceci conduit à une attente d'exécution sur le serveur PC^2 et à un dépassement de temps d'exécution permis (l'erreur "Time Limit Exceeded" sera envoyée).

6. Utilisation des accolades

Il faut délimiter les blocs (conditionnels et itératifs) avec des accolades; même si le bloc contient une seule instruction. Ignorer les accolades de ses blocs augmente le risque de présence de bug dans des futures mises à jour du code.

/* Ce code est fonctionnel (si les deux conditions contiennent une seule instruction).
   Cependant, les bonnes pratiques de codage ne sont pas respectées! */
if(x==1)
   printf("Bonjour!");
else
   printf("Hello ");
   printf("World!");  // Cette instruction n'est pas incluse dans else; elle sera exécutée en dehors du bloc conditionnel

/* Ce code est meilleur en terme de bonne pratique */
if(x==1){
   printf("Bonjour!");
} else {
   printf("Hello ");
   printf("World!");
}

7. Indentation du code source

Un code non indenté est un code non lisible et difficile à déboguer.

ℹ️ L'IDE NetBeans inclue une fonctionnalité d'indentation automatique :

  • Clic droit (avec la souris) dans l'éditeur du code source; puis Format;
  • OU raccourci clavier alt+shift+F.

8. Utilisation de bibliothèque non standard

L'utilisation de bibliothèques hors norme induit à avoir un code non portable qui ne peut pas être compilé sur d'autres systèmes.

La bibliothèque <conio.h> est un exemple de bibliothèque compatible Windows et non compatible avec Linux.

9. Nommer le fichier source avec des espaces ou caractères spéciaux

Eviter l'utilisation des espaces et des caractères spéciaux dans les noms des fichiers sources.

Ceci conduit à une erreur de compilation sur le serveur PC^2 (l'erreur "Compilation Error" sera envoyée).