Warum soll man nicht printf nehmen



  • Ich habe mal gelesen, man solle nicht printf nehmen da es unsicher ist, warum?



  • Weil du ein C++-Buch in der Hand hattest. Oder wenn nur eine Zeichenkette ohne zusätzliche Argumente ausgegeben werden soll; dann bietet sich puts an. Wenn darin nämlich ungeahnt Formatspezifizierer stehen ("%d" etc.) stehen, wirds mit printf eklig.



  • Wieso wird es dann eklig, ich mag die Formattokens sehr. Schon allein weil Übersetzungen schön einfach zu realisieren sind, es ist einfach innovativer zu nutzen als einfach nur zu was zu konkatenieren.

    Also ist printf wegen der Formatzeichen unsicher, wenn ja warum?



  • Wenn die Formatspecifier nicht zu den Argumenten passen, gibt es Probleme.
    Du als Programmierer musst da aufpassen. Das ist die Fehlerquelle.



  • Wenn ich also, aus welchen Gründen auch immer, anstatt einen ints ein char als parameter der printf funktion übergebe dann wird mein Programm unsicher?



  • Das war jetzt ein unpassendes Beispiel 🙂
    chars (und short) werden sowieso auf int erweitert
    Ebenso wird float zu double erweitert.

    Wenn du aber bei %s ein int oder double (oder ...) übergibst, gibt es mehr Probleme.



  • Messer sind scharf, Gabeln spitz, Feuer heiss. Totzdem werden sie verwendet, dennoch verletzen sich Menschen damit. Was willst du hier hoeren? Verwende doch einfach printf.



  • printor schrieb:

    Weil du ein C++-Buch in der Hand hattest. Oder wenn nur eine Zeichenkette ohne zusätzliche Argumente ausgegeben werden soll; dann bietet sich puts an. Wenn darin nämlich ungeahnt Formatspezifizierer stehen ("%d" etc.) stehen, wirds mit printf eklig.

    ⚠ das programm kackt ab wenn NULL an puts übergeben wird ⚠, 💡 printf jedoch nicht ⚠


  • Mod

    NULL abkack0r schrieb:

    ⚠ das programm kackt ab wenn NULL an puts übergeben wird ⚠, 💡 printf jedoch nicht ⚠

    Nicht auf jedem System. Außerdem:
    https://ideone.com/pZxrfT
    https://ideone.com/W3Ffxh
    😃

    It's a bug, not a feature!



  • SeppJ schrieb:

    NULL abkack0r schrieb:

    ⚠ das programm kackt ab wenn NULL an puts übergeben wird ⚠, 💡 printf jedoch nicht ⚠

    Nicht auf jedem System. Außerdem:
    https://ideone.com/pZxrfT
    https://ideone.com/W3Ffxh
    😃

    It's a bug, not a feature!

    Oh, achso! 😮
    Okay!
    😃



  • knivil schrieb:

    Messer sind scharf, Gabeln spitz, Feuer heiss. Totzdem werden sie verwendet, dennoch verletzen sich Menschen damit. Was willst du hier hoeren? Verwende doch einfach printf.

    Ich möchte hören was genau für Probleme ich mit der Sicherheit meines Programmes habe, wenn ich printf nutze? Ich habe halt schon oft gelesen, nutze kein printf wenn es nicht nötig ist etc. Aber niemand kann mir sagen, warum nicht oder mal ein realistisches Beispiel geben, wie dann mein Programm dadurch unsicher werden könnte.

    Hier müssten eigentlich die Antworten wie Pilze aus dem Boden schießen, aber es kommt nur: Weil es Probleme geben kann...Ja zum Geier, was denn für Probleme? Und wie wirken die sich auf die Sicherheit meines Programms aus, Beispiel kleiner Raytracer, ein Spiel, Miniwebserver etc.?



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i = 10;
        printf("%s", i);
        return 0;
    }
    

    Der Compiler gibt zwar eine warning aus, trotzdem stürzt das Programm ab... Das unsichere ist IMMER der Programmierer 🙂
    Also schau auf deine Specifier und nimm sie her!


  • Mod

    Das Wort "Sicherheit" ist bedeutungsüberladen.



  • GER_Moki schrieb:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int i = 10;
        printf("%s", i);
        return 0;
    }
    

    Der Compiler gibt zwar eine warning aus, trotzdem stürzt das Programm ab... Das unsichere ist IMMER der Programmierer 🙂
    Also schau auf deine Specifier und nimm sie her!

    Ok mein Programm stürzt ab und wo ist da dann die Sicherheit meines Systems gefährdet?



  • warumbananekrum schrieb:

    Ok mein Programm stürzt ab und wo ist da dann die Sicherheit meines Systems gefährdet?

    Du meinst die Frage nicht wirklich ernst, oder? 🙄



  • Doch, ich hätte gerne eine Erklärung warum der Absturz meines Programm eine Gefahr ist.

    Das Beispiel ist zwar sehr konstruiert, weil ja schon der Compiler warnt und man solche Fehler in der Regel vorher durch asserts schon ausgemerzt hat, aber trotzdem wäre ich froh wenn hier mal endlich jemand zu Potte kommt und mir erklärt warum printf die Sicherheit meines System in Gefahr bringt?

    Ich verstehe dies bei nichtvalidierung von irgendwelche Daten die von Außen kommen, aber halt nicht bei printf.



  • C wird oft zur Programmierung von Embedded-Systemen verwendet, die z.B. auch in Autos zum Einsatz kommen. Sollte hier (aus was für Gründen auch immer) diese "falsche" Zeile Code stehen (am besten noch in einer Funktion, die nur alle Nase lang aufgerufen wird), kann es sein, dass wichtige Steuerelemente wie zum Beispiel das ABS oder ESP oder sonstwas ausfällt.

    Ich hoffe, das Szenario ist dir gefährlich genug...



  • Wie SeppJ gesagt hat, ist Sicherheit "bedeutungsüberladen". Und ein nicht stabiles Programm fährt auch drunter.
    Aber wenn es dir um die Sicherheit des Systems geht, dann waren vor paar Jahren format string vulneribilities sehr weit verbreitet, die auf falscher Benutzung von printf & Co basieren.



  • GER_Moki schrieb:

    C wird oft zur Programmierung von Embedded-Systemen verwendet, die z.B. auch in Autos zum Einsatz kommen. Sollte hier (aus was für Gründen auch immer) diese "falsche" Zeile Code stehen (am besten noch in einer Funktion, die nur alle Nase lang aufgerufen wird), kann es sein, dass wichtige Steuerelemente wie zum Beispiel das ABS oder ESP oder sonstwas ausfällt.

    Ich hoffe, das Szenario ist dir gefährlich genug...

    Das ist ja lächerlich, das Programm wird sicherlich vorher so einige Male ausgiebig getestet(asserts, Testprogramme etc.). Da ist eine falsche Formel oder dessen Implementierung mindestens genauso gefährlich und eher wahrscheinlich, als das ein printf da sie Ursache für was gefährliches ist.



  • format string vulneribilities, na endlich mal was konkretes wonach ich suchen kann.


Log in to reply