
On Sam, 03 Aug 2002 at 21:33 (+0200), Thorsten Haude wrote:
* Jan Trippler <Jan.Trippler@t-online.de> [02-08-03 20:37]:
Siehe unten. Du drehst mir das Wort im Mund rum.
Die Gelegenheit war günstig.
aber nicht glücklich gewählt - manche Leute (u. a. ich) reagieren sauer, wenn aus fachlicher Diskussion Polemik wird.
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.
Aber auch nur so komplex wie nötig. Auch das ist eine Frage der Robustheit. Man kann auch die Prüfungen im Programm übertreiben. Der Grundsatz sollte lauten: Jedes Datum aus einer unsicheren Quelle wird sofort bei seinem Eingang im Programm geprüft. Dann muss man das nicht bei jeder Operation noch mal machen (vor allem dann nicht, wenn das Datum - in diesem Fall der String - gar nicht verändert wird). Dein Aussage robust vs. schnell ist so absolut nicht richtig. Wie überall gilt auch hier: Aufwand und Nutzen müssen sich entsprechen.
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.
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. Und strncmp() ist allein vielleicht billig, wenn aber mehrere zigtausend Durchläufe diesen zusätzlichen Aufwand treiben, sicher nicht mehr. Das Aasen mit den zur Verfügung stehenden Ressourcen ist auch nicht gerade das Nonplusultra guter Programmierung.
Ich entwickele seit einer Reihe von Jahren Programme u. a. in C für diverse Unix-Derivate (Reliant Unix, HP-UX, AIX, Solaris und vereinzelt SCO waren schon dabei), in keinem einzigen Fall hat der strcmp anders als in der glibc funktionert (intern vielleicht, aber er hat _immer_ bei 0 aufgehört).
Das ist gut, dann kennst Du vielleicht auch einen Beweis, der nicht nur anekdotisch ist. Daß es strcmp()s gibt, die sich so vernünftig verhalten, wie erwartet, haben wir ja schon geklärt.
*anekdotisch* - Du verstehst es, Dinge in das rechte Licht zu rücken :-( - Du stehst nicht zufällig bei der nächsten Wahl als Kandidat auf einer Liste? Um eine weitere Anekdote hinzuzufügen: auch im Borland Turbo C++, Borlands C++-Builder und in M$ Visual C++ hören die strcmp bei der ersten Null auf. Kehren wir die Frage mal um: Kennst du einen strcmp(), der sich _nicht_ so vernünftig verhält? 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? [...]
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. Durch wie viele Reifen muss ich denn springen, um in C Strings zu verarbeiten? _Du_ baust doch immer wieder neue Reifen auf, offenbar willst Du ja springen? Ich versuche Dir die ganze Zeit zu erklären, dass Du die Hälfte Deiner Reifen einpacken kannst. /* Int deklarieren: */ int i; /* char-Array deklarieren */ char s[16]; /* int zuweisen */ i = 0; /* String zuweisen */ strcpy (s, "String"); /* int vergleichen */ if (i == 0) ... /* String vergleichen */ if (! strcmp (s, "String")) ... Wenn Du _gesicherte_ Zuweisungen haben willst, musst Du sowohl bei numerischen als auch bei allen char-basierten Werten zusätzlichen Aufwand treiben. Jan