Moin,
* Jan Trippler
On Sam, 03 Aug 2002 at 21:33 (+0200), Thorsten Haude wrote:
* Jan Trippler
[02-08-03 20:37]: versuch[6] ist ein char-Array. Natürlich kannst Du solche char-Arrays - wenn Du es möchtest - ohne 0-Terminierung anlegen (wenn es z. B. für Flags genutzt wird, ist das auch nicht nötig), aber wenn Du _irgendeine_ Stringfunktion drauf loslassen willst, dann _muss_ am Ende eine 0 stehen.
Die ist aber schon bewußt, daß diese Dinge auch durch Fehler anderswo bzw. durch Angriffe passieren können, oder? Darum sollte C-Code idR. so robust wie möglich sein, nicht so schnell wie möglich.
Dein Aussage robust vs. schnell ist so absolut nicht richtig. Wie überall gilt auch hier: Aufwand und Nutzen müssen sich entsprechen.
Boah, wo habe ich denn gesagt, daß man unter allen Umständen, ausnahmslos und auch wenn das Leben von Millionen davon abhängt, strncmp() nutzen soll? Komm mir doch nicht mit Gemeinplätzen über Aufwand und Nutzen! Ich bleibe bei dieser Aussage: C-Code sollte idR so robust wie möglich sein, nicht so schnell wie möglich. Bitte erkläre mir, warum das "absolut nicht richtig" ist.
Es geht doch nur darum, daß diese ganze C-Eigenheit mit dem Zeiger-auf-Chararacter offensichtlich und bekannterweise nicht wasserdicht ist. Darum sollte man bei ihrer Benutzung keine Haare spalten, sondern auf Nummer sicher gehen.
Die Haarespalterei machst Du hier. Du behauptest seit Tagen, strcmp liest über die 0 hinweg und das ist Stuss.
Ich behaupte nur, daß ich nicht sicher wissen kann, daß es anders ist.
Auch das ist Stuss.
Bring Beweise statt Beleidigungen.
Du behauptest seit Tagen, dass die Benutzung von strcmp eine Sicherheitslücke ist und das ist Stuss
Ich behaupte, daß das Leben zu kurz und strncmp() zu billig ist, um darüber nachdenken zu müssen.
Das habe ich gerade in meiner Mail an Andre Heine geschrieben: Genau das *nicht darüber nachdenken* ist gefährlich.
Du vestehst das zu wörtlich. Ich kann mit den strn*-Funktionen deutlich einfacher überprüfen, ob die Speichergrenzen eingehalten werden. Ich habe auch schon strcpy() benutzt. (Panik! Entsetzen!)
Und strncmp() ist allein vielleicht billig, wenn aber mehrere zigtausend Durchläufe diesen zusätzlichen Aufwand treiben, sicher nicht mehr.
Hatte nicht jemand geschrieben, daß strncmp() in der glibc effizienter als strcmp() ist?
Das Aasen mit den zur Verfügung stehenden Ressourcen ist auch nicht gerade das Nonplusultra guter Programmierung.
Nein, da setze ich halt Prioritäten.
Kehren wir die Frage mal um: Kennst du einen strcmp(), der sich _nicht_ so vernünftig verhält?
Nein, aber das wäre nur wichtig, wenn ich alle strcmp()s kennen würde. Ich kenne aber nur einen einzigen, kann noch ein knappes halbes Dutzend durch Testprogramme testen.
Oder wie wärs mal mit ein wenig Logik? strcmp ist (neben strncmp) eine _String_-Funktion. Strings sind nullterminierte char-Arrays. Welchen Sinn sollte es für eine String-Funktion machen, einen String über seinen Terminator hinaus zu bearbeiten?
Das wäre ja sensationell, wenn es in C-Code zu Fehlern käme. Meine Güte, wie kam ich nur auf diese Idee?
Tut mir leid, ich hätte es nicht als wörtliches Zitat markieren sollen, aber wenn es keinen Typ String gibt, gibt es auch keine Strings: Gerade darum muß man ja durch so viele Reifen springen, wenn man in C Strings verarbeitet.
Auch dies ist wieder mal eine typisch Haude'sche Schlussfolgerung. Natürlich gibt es in C Strings: Das sind nullterminierte char-Arrays.
Das ist eine bloße Konvention, begründet in eben jenen Funktionen, über die wir hier sprechen. Thorsten -- Politik kann man in diesem Lande definieren als die Durchsetzung wirtschaftlicher Zwecke mit Hilfe der Gesetzgebung. - Kurt Tucholsky