Hat sscanf(“123456789123456789123456789”, “%d”, &n) ein definiertes Verhalten?

Lesezeit: 3 Minuten

Benutzeravatar von chqrlie
chqrlie

Wann sscanf() oder eine andere Funktion aus der scanf Familie erhält eine Ziffernfolge, deren umgerechneter Wert den Maximalwert des Zieltyps Integer überschreitet,

  • soll die Konvertierung als gescheitert gelten?
  • Ist das Verhalten überhaupt definiert?

  • Die Frage ist subtiler: Das Parsen der Subjektsequenz hat das Verhalten wie folgt definiert strtol()aber den resultierenden Wert in an speichern int hat ein Implementierungsverhalten, wenn der Wert zu groß ist, und wenn die Bibliotheksfunktion auf Überlauf testet, was sie sollte, sollte dieser Überlauf als Konvertierungsfehler angesehen werden, der zu einer kurzen Zählung führt, oder nicht?

    – chqrlie

    24. Juni 2017 um 20:18 Uhr

  • @WeatherVane: Empirische Tests sind eine schlechte Referenz für das Verhalten von C-Code.

    – zu ehrlich für diese Seite

    24. Juni 2017 um 20:24 Uhr

  • @Olaf das ist wohl der Grund für die FWIW …

    Benutzer2371524

    24. Juni 2017 um 20:25 Uhr

  • @KeithThompson: Der Titel lässt etwas Raum für definiertes Verhalten, aber der Hauptteil der Frage ist eindeutig: eine Folge von Ziffern gegeben, deren konvertierter Wert den Maximalwert für den Integer-Typ überschreitet.

    – chqrlie

    24. Juni 2017 um 20:51 Uhr

  • @KeithThompson: Das Verhalten ist in der Tat iff definiert INT_MAX >= 123456789123456789123456789. Das >= ist genauer, obwohl ich glaube INT_MAX muss eine Potenz von 2 minus 1 sein.

    – chqrlie

    24. Juni 2017 um 21:02 Uhr

zu ehrlich für den Benutzer-Avatar dieser Seite
zu ehrlich für diese Seite

Aus dem Standard 7.21.6.2p10 ((f)scanfgilt für die ganze Familie):

… Wenn dieses Objekt keinen passenden Typ hat, oder kann das Ergebnis der Konvertierung nicht im Objekt dargestellt werden, ist das Verhalten undefiniert.

Sieht nach einem weiteren Grund aus, sehr vorsichtig mit dem zu sein scanf Familie. Das strtoXX Funktionen haben ein vollständig definiertes Verhalten. Sie kehren zurück LONG_MAX etc. für zu große Eingabe und Set errno == ERANGE. Wenn Sie also genaue Informationen benötigen, tokenisieren Sie die Eingabe manuell und verwenden Sie diese Funktionen zur Konvertierung. Ein weiterer Vorteil: bessere Fehlerbehandlung.

  • Beachten Sie jedoch „Wenn die Unterdrückung von Zuweisungen nicht durch ein * angegeben wurde, wird das Ergebnis der Konvertierung in das Objekt eingefügt, auf das das erste Argument nach dem Formatargument zeigt, das noch kein Konvertierungsergebnis erhalten hat. Wenn dieses Objekt kein entsprechendes Typ, oder wenn das Ergebnis der Konvertierung nicht im Objekt dargestellt werden kann, ist das Verhalten undefiniert.”

    – cpplerner

    24. Juni 2017 um 20:16 Uhr

  • @cpplearner: Lies meine Antwort noch einmal, ich habe mich mit meiner anfänglichen Schlussfolgerung geirrt, an der falschen Stelle zu suchen. Es ist sehr klar. (glauben Sie es oder nicht, ich habe das geändert, bevor ich Ihren Kommentar gelesen habe)

    – zu ehrlich für diese Seite

    24. Juni 2017 um 20:19 Uhr


  • @Olaf 7.22.1.4p8 “Wenn der korrekte Wert außerhalb des Bereichs darstellbarer Werte liegt […] der Wert des Makros ERANGE darin gespeichert ist errno.“. So können Sie differenzieren. strtol() ist wirklich vollständig definiert.

    Benutzer2371524

    24. Juni 2017 um 20:30 Uhr


  • @FelixPalmen: Dummkopf, ich habe das gelesen, als ich die ursprüngliche Version meiner Antwort geschrieben habe, aber vergessen, als ich meine Bemerkung hinzugefügt habe. Entschuldigung, ich bin momentan etwas abgelenkt. Danke für die Erinnerung.

    – zu ehrlich für diese Seite

    24. Juni 2017 um 20:35 Uhr


  • Gute Antwort. Ich habe die C11-Spezifikation gelesen, bevor ich die Frage gepostet habe, und ich habe diese einfache Pointe verpasst … scanf() hat so viele Mängel und wird in keiner Weise missbraucht, es sollte wirklich vermieden werden.

    – chqrlie

    24. Juni 2017 um 20:57 Uhr

1409260cookie-checkHat sscanf(“123456789123456789123456789”, “%d”, &n) ein definiertes Verhalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy