gdblesson
Niveau : ⭐
Une introduction à l’utilisation de gdb pour déboguer un programme C simple.
Consignes du TP : gdblesson.pdf
Que signifie "Floating point exception (core dumped)" ?
L'erreur "Floating point exception (core dumped)" est un message d'erreur que vous pourriez rencontrer lors de l'exécution d'un programme informatique.
-
Floating point exception : Cela indique généralement qu'une opération en virgule flottante anormale a eu lieu. Cela peut être dû à des opérations comme la division par zéro, le résultat d'une opération est trop grand pour être représenté (dépassement), ou trop petit pour être distingué de zéro (sous-dépassement).
-
(core dumped) : Cette partie du message signifie que l'état du programme au moment de l'exception a été enregistré dans un fichier appelé "core dump". Ce fichier contient une image de la mémoire du programme au moment de l'erreur et peut être utilisé pour déboguer le programme avec un débogueur, comme GDB sous Linux, afin de comprendre ce qui a mal tourné.
Pourquoi la division par zéro peut être un problème de sécurité dans les programmes informatiques ?
La division par zéro peut être un problème de sécurité dans les programmes informatiques pour plusieurs raisons :
-
Comportement imprévisible : La division par zéro n'est pas définie mathématiquement, et les systèmes informatiques gèrent cette condition de manière différente. Certains systèmes pourraient terminer le programme, tandis que d'autres pourraient continuer à s'exécuter avec des résultats imprévisibles. Ce comportement imprévisible peut être exploité par des attaquants pour causer des dommages ou pour contourner des mécanismes de sécurité.
-
Déni de service (DoS) : Si un attaquant peut intentionnellement provoquer une division par zéro dans un programme ou un service qui ne gère pas correctement cette situation, cela peut entraîner un plantage ou un comportement anormal. Cela pourrait être utilisé pour réaliser une attaque par déni de service, rendant le service indisponible pour les utilisateurs légitimes.
-
Exécution de code arbitraire : Dans certains cas, une exception non gérée comme une division par zéro peut conduire à des vulnérabilités plus graves, telles que l'exécution de code arbitraire. Si un attaquant parvient à manipuler la mémoire ou le flux d'exécution du programme suite à une erreur de division par zéro, il pourrait potentiellement exécuter du code malveillant.
-
Fuites d'informations : Une exception de division par zéro peut parfois entraîner des fuites d'informations. Par exemple, si une application Web affiche des messages d'erreur détaillés incluant des informations sur l'état interne de l'application lorsqu'une division par zéro se produit, cela pourrait révéler des informations sensibles à un attaquant.
Pour ces raisons, il est important que les développeurs anticipent et gèrent correctement les conditions de division par zéro et autres exceptions arithmétiques pour éviter des vulnérabilités de sécurité.
Cela implique souvent de valider les entrées pour s'assurer qu'elles ne causeront pas de telles conditions, et d'implémenter une gestion d'erreur robuste pour traiter les exceptions d'une manière qui ne compromet pas la sécurité de l'application.
Explication de la ligne void main(int argc, char *argv[]) {
Dans le langage C, la fonction main
est le point d'entrée d'un programme. *
C'est la première fonction qui est exécutée lorsque le programme est lancé.
La ligne de code void main(int argc, char *argv[]) {
permet au programme de recevoir des arguments de la ligne de commande.
-
int argc
:argc
est une variable qui représente le nombre d'arguments de la ligne de commande que le programme a reçus. Leint
devant signifie queargc
est de type entier. Cela correspond au nombre d'éléments dans le tableauargv
. -
char *argv[]
:argv
est un tableau de chaînes de caractères (strings). En C, une chaîne de caractères est représentée par un tableau de caractères terminé par un caractère nul (\0
), et unchar *
est un pointeur vers le premier caractère de cette chaîne. Donc,char *argv[]
est un tableau de pointeurs vers des chaînes de caractères. Chaque élément du tableau est un argument de la ligne de commande passé au programme, oùargv[0]
est généralement le nom du programme lui-même, etargv[1]
est le premier argument passé par l'utilisateur, et ainsi de suite.
Voici un exemple d'utilisation de cette fonction :
#include <stdio.h>
void main(int argc, char *argv[]) {
printf("Il y a %d arguments de la ligne de commande:\n", argc);
for (int i = 0; i < argc; i++) {
printf("Argument %d : %s\n", i, argv[i]);
}
}
Si vous exécutez ce programme en passant des arguments, il affichera le nombre d'arguments et les listera un par un.
A quoi sert la fonction atoi()
de la bibliothèque standard C ?
La fonction atoi()
est une fonction qui convertit une chaîne de caractères (string) en un entier (integer).
Le nom atoi
est une abréviation de "ASCII to integer".
Cette fonction est définie dans l'en-tête <stdlib.h>
.
Voici comment atoi()
fonctionne :
- Elle lit la chaîne de caractères fournie en argument.
- Elle ignore tous les espaces blancs initiaux (comme les espaces, les tabulations, etc.).
- Elle interprète la suite continue de chiffres qui commence dans la chaîne comme un nombre entier.
- Elle arrête la conversion dès qu'un caractère non numérique est rencontré après les chiffres.
La fonction
atoi()
ne détecte pas les erreurs.
Si la chaîne ne contient aucun chiffre au début,
atoi()
retournera 0.
La fonction
atoi()
ne gère pas les débordements, donc si la chaîne représente un nombre qui dépasse la capacité d'un entier, le résultat ne sera pas correct.
Exemple d'utilisation de atoi()
:
#include <stdio.h>
#include <stdlib.h>
int main() {
const char *str = "1234";
int val = atoi(str);
printf("La valeur numérique est %d\n", val);
return 0;
}
Dans cet exemple, atoi()
convertira la chaîne "1234" en l'entier numérique 1234.
Puisque la fonction atoi()
ne détecte pas les erreurs, il est recommandé d'utiliser à la place les fonctions strtol()
ou strtoll()
qui fournissent des informations sur les erreurs.
Si vous avez besoin d’aide sur plusieurs commandes, vous pouvez utiliser man commande
pour afficher le
manuel depuis un terminal de la VM Ubuntu qui contient les labtainers.
Par exemple :
man gcc