char *fdisk_string = "fdisk ";Keine gute Idee. Oder was meinst du, welcher Speicher da für den zusammengesetzten String benutzt wird...?
strcat(fdisk_string, install_device);
09. November 2026, 18:30
char *fdisk_string = "fdisk ";Keine gute Idee. Oder was meinst du, welcher Speicher da für den zusammengesetzten String benutzt wird...?
strcat(fdisk_string, install_device);
char *fdisk_string = "fdisk ";Keine gute Idee. Oder was meinst du, welcher Speicher da für den zusammengesetzten String benutzt wird...?
strcat(fdisk_string, install_device);
char* fdisk_str;
fdisk_str = malloc(20); // müsste reichen
sprintf("fdisk %s", install_device);
Sfan
Mein Vorschlag wäre:Code: [Auswählen]char* fdisk_str;
fdisk_str = malloc(20); // müsste reichen
sprintf("fdisk %s", install_device);
fdisk_str = malloc(strlen("fdisk ") + strlen(install_device) + 1));
fdisk_str = malloc(20); // müsste reichenEigentlich hätte ich erwartet, dass heutzutage bekannt ist, dass Buffer Overflows gefährlich sind...
sprintf("fdisk %s", install_device);
fdisk_str = malloc(20); // müsste reichenEigentlich hätte ich erwartet, dass heutzutage bekannt ist, dass Buffer Overflows gefährlich sind...
sprintf("fdisk %s", install_device);
system() führt keinen Shell-Befehl aus, sondern ein Programm. Wie die FIXME-Kommentare zeigen, sollte sich das aber ändern.Dann könnte ich das ja fixen.
Ob 20, 42 oder 1337 ist völlig egal, das Problem steckt im "// müsste reichen". Das ist keine Annahme, die du machen kannst. Wenn es eine konstante Länge ist und du nicht weißt, wie lange der Quellstring ist, ist es falsch und verursacht im allgemeinen Fall einen Buffer Overflow.fdisk_str = malloc(20); // müsste reichenEigentlich hätte ich erwartet, dass heutzutage bekannt ist, dass Buffer Overflows gefährlich sind...
sprintf("fdisk %s", install_device);
Wenn ich es mir so recht überlege ist 20 wenig....
snprintf ist okay, dann wird der String eben notfalls abgeschnitten.Bei snprintf ist aber der Rückgabewert interessant, der sagt wie lang der String geworden wäre wenn er nicht abgeschnitten werden müsste (oder wie lang der String tatsächlich ist falls der Buffer gereicht hat) so das man zumindest prüfen kann ob der resultierende String gültig ist.
asprintf alloziert einfach genug neuen Speicher, ist aber nicht Standard-CSchade.
Für C1X ist es aber anscheinend vorgesehen. (strdup soll dann übrigens auch endlich mal in die Standardbibliothek, das hab ich auch schon vermisst)asprintf alloziert einfach genug neuen Speicher, ist aber nicht Standard-CSchade.
eingabe = readline("Geben sie etwas ein [etwas]: ");
if(eingabe == NULL) {
eingabe = "etwas";
}
if(!strlen(eingabe)) {
eingabe = "etwas";
}
Geh mal zu einer Embedded-MesseWar ich vor genau einer Woche erst.

wo ein großer Aufsteller steht "finde den Bug in folgender C-Funktion"Ja, diese Dinger kenne ich ganz gut, meistens ist der Fehler für den geübten C-Coder recht offensichtlich aber manchmal müssen selbst echte Cracks richtig suchen bis man den Fehler findet. Interessant ist das an diesen Ständen meistens irgendwelche Wundertools angeboten werden die solche Fehler automagisch finden sollen, nur wirklich funktionieren tun diese Tools auch nicht weil es einfach ziemlich schwer ist klar zu definieren was nun genau ein Fehler ist und was nicht. Oft bringen diese Tools extrem viele Fehlalarme und finden gleichzeitig die tatsächlichen Fehler trotzdem nicht.

Aber man kann sich auch mit Java oder C# genau so effektiv ins eigene Knie schießen nur das dort die Probleme nicht immer so offensichtlich sind.Aber all diese Punkte lassen sich im wesentlichen auf 2 grundsätzliche Probleme zurückführen: Bereichsüberschreitungen und ungültige Pointer.Das sind aber Probleme, die man gerade nicht in Java/C# hat: In dem Sinn, dass es manchmal still und heimlich funktioniert und ein andermal nicht und die Auswirkungen irgendwo ganz anders zu spüren sind, zB hatte ich schon einen Bufferoverflow gesehen der netterweise die Schleifenvariable auf 0 setzt und das ganze zu einer Endlosschleife machte; Sondern in Java/C# gibt konsistent Exceptions, deren Auslöser auch lokalisierbar ist.