Rendre un logiciel existant robuste se fait en plusieurs étapes.
#1 : Une compilation sans avertissement
Un avertissement est souvent un bug potentiel. Un comparaison nombre entier naturel et nombre entier relatif peut être une source de bug (integer overflow). => gcc -Wall -Wextra. Je trouve ça complètement débile que "-Wall" n'affiche pas ALL (tous) les avertissements... (avec gcc < 4 : -Wall -W). Pour les fanatiques : -Werror bloque la compilation à chaque avertissement.
#2 : Valgrind
Il faut que le programme ait zéro erreur dans Valgrind.
Maintenant il faut revoir le programme pour limiter les dégats. Ca peut être :
- Vérifier strictement toutes les entrées utilisateurs : clavier, réseau, variable d'environnement, fichier de configuration, fichier en entrée, événement X11, etc.
# Mon expérience
Posté par Victor STINNER (site web personnel) . En réponse au journal Programmation robuste. Évalué à 7.
#1 : Une compilation sans avertissement
Un avertissement est souvent un bug potentiel. Un comparaison nombre entier naturel et nombre entier relatif peut être une source de bug (integer overflow). => gcc -Wall -Wextra. Je trouve ça complètement débile que "-Wall" n'affiche pas ALL (tous) les avertissements... (avec gcc < 4 : -Wall -W). Pour les fanatiques : -Werror bloque la compilation à chaque avertissement.
#2 : Valgrind
Il faut que le programme ait zéro erreur dans Valgrind.
#3 : Analyse statique du code
Utiliser SPlint, Rats, Flawfinder, etc. pour trouver les portes d'entrées possible pour des failles.
http://www.haypocalc.com/wiki/Analyse_statique_de_code
### Fin de la partie basique ###
Maintenant il faut revoir le programme pour limiter les dégats. Ca peut être :
- Vérifier strictement toutes les entrées utilisateurs : clavier, réseau, variable d'environnement, fichier de configuration, fichier en entrée, événement X11, etc.
Voir les dégats que ça peut faire :
http://sam.zoy.org/zzuf/
http://www.haypocalc.com/wiki/Injection_de_code
http://www.haypocalc.com/wiki/Injection_de_SQL
http://www.haypocalc.com/wiki/Format_string_attack
- Vérifiez aussi le code de retour des fonctions, et particulier les fonctions systèmes (fopen, chdir, fork, etc.).
- Séparation des privilèges : séparer et limiter au maximum le code exécuté avec des privilèges elevés
- etc.