Gestion sûre des entiers
Techniques complètes de sécurité des entiers
Opérations arithmétiques sûres
graph TD
A[Gestion sûre des entiers] --> B[Vérification de plage]
A --> C[Conversion de type]
A --> D[Bibliothèques spécialisées]
A --> E[Techniques du compilateur]
Stratégies de programmation défensive
1. Validation explicite de la plage
int safeDivide(int numerator, int denominator) {
// Vérifier la division par zéro
if (denominator == 0) {
fprintf(stderr, "Erreur de division par zéro\n");
return -1;
}
// Prévenir un dépassement de capacité potentiel
if (numerator == INT_MIN && denominator == -1) {
fprintf(stderr, "Dépassement de capacité potentiel détecté\n");
return -1;
}
return numerator / denominator;
}
2. Méthodes de conversion de type sûres
Type de conversion |
Approche recommandée |
Niveau de risque |
Signé vers Non signé |
Vérification explicite de la plage |
Moyen |
Non signé vers Signé |
Valider la valeur maximale |
Élevé |
Plus large vers plus étroit |
Tests complets des limites |
Critique |
Prévention avancée des dépassements de capacité
Fonctions arithmétiques vérifiées
#include <stdint.h>
#include <stdbool.h>
bool safe_add(int a, int b, int *result) {
if (((b > 0) && (a > INT_MAX - b)) ||
((b < 0) && (a < INT_MIN - b))) {
return false; // Un dépassement de capacité se produirait
}
*result = a + b;
return true;
}
Techniques prises en charge par le compilateur
Indicateurs de compilateur pour la sécurité
## Indicateurs de compilation GCC
gcc -ftrapv ## Piège le dépassement de capacité signé
gcc -fsanitize=undefined ## Sanitaire des comportements indéfinis
Bibliothèques de gestion spécialisée des entiers
1. Implémentation SafeInt
typedef struct {
int value;
bool is_valid;
} SafeInt;
SafeInt safe_multiply(SafeInt a, SafeInt b) {
SafeInt result = {0, false};
// Vérification complète du dépassement de capacité
if (a.is_valid && b.is_valid) {
if (a.value > 0 && b.value > 0 &&
a.value > (INT_MAX / b.value)) {
return result;
}
result.value = a.value * b.value;
result.is_valid = true;
}
return result;
}
Recommandations pratiques pour les développeurs LabEx
- Valider toujours les plages d'entrée.
- Utiliser des conversions de type explicites.
- Implémenter des vérifications d'erreur complètes.
- Tirer parti des indicateurs d'avertissement du compilateur.
- Envisager l'utilisation de bibliothèques spécialisées pour les entiers sûrs.
Flux de gestion des erreurs
graph TD
A[Opération entière] --> B{Vérification de plage}
B -->|Valide| C[Exécuter l'opération]
B -->|Invalide| D[Gestion des erreurs]
D --> E[Journaliser l'erreur]
D --> F[Retourner un code d'erreur]
D --> G[Échec en douceur]
Principes de sécurité clés
- Ne jamais faire confiance aux entrées non validées.
- Toujours vérifier les limites des opérations arithmétiques.
- Utiliser les types entiers appropriés.
- Implémenter une gestion complète des erreurs.
- Préférez les conversions explicites aux conversions implicites.
En adoptant ces techniques de gestion sûre des entiers, les développeurs peuvent créer des programmes C plus robustes et fiables, minimisant ainsi le risque de comportements inattendus et de vulnérabilités de sécurité.