// Fehlersimulation #include #include // Mögliche Fehler: // 1 Speicher wird nicht freigegeben (Speicherleck) // 2 Speicher wird mehrfach freigegeben // 3 Schreiben auf bereits freigegebenen Speicher // 4 Freigeben von Speicher der gar nicht alloziert wurde // 5 Schreiben auf beliebigen Speicher // 6 Benutzen des Stacks eines bereits verlassenen Unterprogramms // 7 Schreiben über den allozierten Speicher hinaus // 8 Kein Fehler! char* up () { char a='5'; return &a; } void access(void* ptr) { *(char*)ptr=0; } int main(int argc, char **argv) { char* c1_ptr; char* c2_ptr; int c; c1_ptr = (char *)malloc(8); if (argc!=2) return 0; c = *argv[1]; switch (c) { case '1': c1_ptr=0; break; // Memory Leak case '2': free (c1_ptr); free (c1_ptr); // Mehrfaches Freigeben break; case '3': free (c1_ptr); // Schreiben auf freigegebenen access(c1_ptr); // Speicherplatz break; case '4': free((void *)c2_ptr); // Freigeben von break; // nicht allociertem Speicher case '5': access(c2_ptr); //Schreiben auf beliebigen break; // Speicher case '6': c2_ptr = up(); // Benutzen des Stacks eines printf("%c\n",*c2_ptr); // verlassenen Unterprogramms break; case '7': access(c1_ptr+9); // Schreiben hinter den Speicher break; case '8': free (c1_ptr); // kein Fehler! break; } printf("Ende\n"); return 0; }