Abwehrprogrammierung
Sichere Arithmetik-Techniken
Überprüfung vor der Berechnung
int safe_multiply(int a, int b) {
if (a > 0 && b > INT_MAX / a) return -1;
if (a < 0 && b < INT_MAX / a) return -1;
return a * b;
}
Strategien zur Überlaufdetektion
graph TD
A[Arithmetische Operation] --> B{Grenzen prüfen}
B -->|Sicher| C[Berechnung durchführen]
B -->|Unsicher| D[Potenziellen Überlauf behandeln]
Empfohlene Praktiken
Strategie |
Beschreibung |
Beispiel |
Explizite Bereichsprüfung |
Validierung der Eingabe vor der Berechnung |
Überprüfung der Eingabe auf Typgrenzen |
Sichere Konvertierung |
Sorgfältige Typumwandlung verwenden |
Überprüfung der Wertebereiche bei Konvertierungen |
Fehlerbehandlung |
Implementierung einer robusten Fehlerverwaltung |
Rückgabe von Fehlercodes oder Verwendung von Ausnahmen |
Sichere Implementierung der Multiplikation
#include <limits.h>
#include <stdbool.h>
bool safe_multiply(int a, int b, int* result) {
if (a > 0 && b > 0 && a > INT_MAX / b) return false;
if (a > 0 && b < 0 && b < INT_MIN / a) return false;
if (a < 0 && b > 0 && a < INT_MIN / b) return false;
if (a < 0 && b < 0 && a < INT_MAX / b) return false;
*result = a * b;
return true;
}
Compiler-Warnungen und statische Analyse
Aktivieren von Überlaufprüfungen
gcc -Wall -Wextra -Woverflow -O2 your_program.c
Erweiterter Überlaufschutz
Verwendung integrierter Funktionen
#include <stdlib.h>
int main() {
int a = 1000000;
int b = 1000000;
int result;
if (__builtin_smul_overflow(a, b, &result)) {
// Überlauf behandeln
fprintf(stderr, "Multiplikationsüberlauf erkannt\n");
}
return 0;
}
Prinzipien der Abwehrprogrammierung
Bei LabEx empfehlen wir:
- Immer Wertebereiche der Eingabe validieren
- Verwendung geeigneter Datentypen
- Implementierung expliziter Überlaufprüfungen
- Verwendung von Compiler-Warnungen
- Durchführung umfassender Tests
Fehlerbehandlungsmuster
enum CalculationResult {
CALC_SUCCESS,
CALC_OVERFLOW,
CALC_INVALID_INPUT
};
enum CalculationResult safe_divide(int a, int b, int* result) {
if (b == 0) return CALC_INVALID_INPUT;
if (a == INT_MIN && b == -1) return CALC_OVERFLOW;
*result = a / b;
return CALC_SUCCESS;
}