Différences entre les versions de « Conseils de codage en C/Robustesse des programmes »

+ ressources
(Compilation stricte)
(+ ressources)
===Outils===
Les outils de contrôle statiques comme '''splint''' émettent un warning lorsqu'un codes retour de fonction n'est pas testé ou explicitement ignoré.
 
== Gestion des ressources ==
Toute ressource allouée (mémoire, fichier ouvert, outil de synchronisation, ...) doit obligatoirement être libérée quoi qu'il se passe, erreur ou non.
 
===Justification===
Une ressource non libérée après utilisation peut n'être libérée qu'à la fin de l'application. Mais auparavant, celle-ci limite les ressources disponibles du système et si le code est appelé plusieurs fois, une erreur de ressource peut se produire (pas assez de mémoire, ...).
 
===Outils===
Un certain nombre d'outils permet de détecter les fuites mémoires et de voir l'occupation des ressources.
 
Mais avant tout, il faut avoir un code de gestion des ressources correct :
* Tester le code de retour de la fonction d'allocation, et ne pas exécuter le reste du code en cas d'échec,
* Libérer la ressource quoi qu'il se passe, en un seul endroit du code afin d'éviter de libérer plusieurs la même ressource, et si possible dans la même fonction que l'instruction d'allocation.
 
=== Exemple ===
 
<source lang="C">
//...
hFile = fopen(NOM_FIC, "r");
if (hFile == NULL)
{
perror("Erreur");
(void)fprintf(stderr,
"Impossible d'ouvrir %s en lecture\n",
NOM_FIC);
exit(EXIT_FAILURE);
}
else
{
erreur = traiterFichier(hFile);
fclose(hFile);
}
</source>
Le traitement du fichier est délégué dans une fonction séparée. Celle-ci pouvant alors retourner un code d'erreur avec l'instruction <tt>return</tt> sans se soucier de fermer le fichier ouvert, vu qu'il sera fermé juste après l'appel à la fonction.