Re: Was ist eine gueltige Message-ID?
Moin,
* Jan Trippler
On Sam, 03 Aug 2002 at 00:34 (+0200), Thorsten Haude wrote:
* Jan Trippler
[02-08-02 22:04]: Die Länge eines Strings in C ist _nie_ unbekannt. Nutze strlen(), dann erfährst auch Du sie!
Ähh... *Du* hattest angedeutet, daß ein strlen zu teuer ist.
Ja, das meine ich auch nach wie vor. Mir ging es um Deinen Satz mit den unbekannten String-Längen. Was machst du hier für eine Argumentation? Du hast was gegen Strings unbekannter Länge, ich nenne strlen. Du willst strncmp nutzen, weil Du (was ich immer noch nicht kapiere) behauptest, dass strcmp über die 0 hinwegliest (oder lesen könnte). Ich behaupte, dass dann immer zusätzlicher Aufwand durch die Ermittlung der Länge auftaucht. Was widerspricht sich da in meiner Argumentation?
Nichts, ich kann Dir in diesem Punkt nicht mehr folgen.
Du hast bei einem strncmp() _immer_ den zusätzlichen Aufwand, die String-Länge prüfen, bestimmen, übergeben zu müssen.
Nein, gewöhnlich haben Strings eine #definierte maximale Länge, die man dann auch nett in strncmp() benutzen kann.
Gewöhnlich haben _statisch_ deklarierte Strings eine definierte maximale Länge - was ist mit dynamisch erzeugten (Stichwort malloc)?
An welchen Programmen hast Du bisher gearbeitet? Kann man die #definierte Länge wohl auch dazu benutzen, einen String zu allozieren? Wenn nein, warum nicht?
Weil man sie nicht vorher kennt!
Ok, das führt mir alles zu weit weg. Es gibt bestimmt eine Menge Fälle, in denen man strcmp() benutzen soll, aber eben auch Fälle, in denen es nicht nötig ist.
Und auch bei statischen Strings musst Du rechnen, nämlich dann, wenn die Definitionen zweier Strings sich unterscheiden. Dann musst Du nämlich feststellen, welche der beiden Längen Du nimmst.
min(len1, len2)
Ja, z. B. - also zusätzlicher (unnötiger) Aufwand.
Ich sehe nicht, daß es garantiert in allen Fällen unnötig ist.
Das willst du alles hart kodiert in das Programm schreiben? Wie flexibel und gut wartbar ;-)
Dafür gibt's #defines.
Und jedesmal ein neuer Build, wenn sich irgendwo eine Länge ändert. Cool! Den Versionszähler kann man sich dann als Ventilator in die Küche hängen ;-)
Huh? Warum sollte sich die Länge so häufig ändern.
Das ist nochmal eine schöne Zusammenfassung von dem, worum es hier geht. Allerdings ist immer noch unklar, ob über die \0 hinaus verglichen wird.
Da Du den Code-Schnipsel offensichtlich nicht gelesen / verstanden hast, hier noch mal eine kommentierte Version:
Danke.
Der Code wird im Gegenteil dann leichter lesbar sein, wenn sich der Leser nicht auch noch darüber Gedanken machen muß, ob mal wieder eine Funktion aus string.h aus dem Ruder läuft.
Diese Begründung ist ja nun absoluter Quatsch, sorry! Woher soll denn Dein Leser wissen, dass nicht strncmp() aus dem Ruder läuft?
Sinnvollerweise benutzt man für das n den gleichen Wert, der für die Allozierung des Strings benutzt worden ist. Dieser Wert hat dann noch einen brauchbaren Namen wie MAX_PATH_LEN, dann kann man das schon erkennen.
Nochmal: Geh doch mal auf Deine eigenen Argumente ein: *...Funktion aus string.h aus dem Ruder läuft...*; Ich: *..wissen, dass nicht strncmp() aus dem Ruder läuft...* - was hat diese Deine Antwort mit dem Text darüber zu tun?
Man benutzt halt einen festgelegten Wert für die Allozierung und den gleichen Wert für die Begrenzung der strn*-Funktionen. Das ist auch kein geheimer Trick, sondern relativ naheliegend, darum kann das auch der Leser wissen.
BTW: Gehen wir mal davon aus, dass strcmp() nicht bei 0 aufhört. Dann sollte man doch davon ausgehen, dass auch strncmp() nicht bei 0 aufhört, oder?
Man sollte nicht davon ausgehen, daß es nicht passiert. Wahrscheinlich ist es nicht.
Dann müsste aber der folgende Code-Schnipsel ein ziemlich merkwürdiges Resultat ergeben:
Ich hab's nicht verstanden, was meinst Du? Thorsten -- This is so cool I've to go to the bathroom. - Calvin
On Sam, 03 Aug 2002 at 20:52 (+0200), Thorsten Haude wrote: [...]
Ok, das führt mir alles zu weit weg. Es gibt bestimmt eine Menge Fälle, in denen man strcmp() benutzen soll, aber eben auch Fälle, in denen es nicht nötig ist.
Es gibt Fälle, in denen man strncmp() benutzen soll (wenn einen z. B. nur die ersten n Zeichen eines Strings interessieren), ansonsten ist es nicht nötig. Es bedeutet zusätzlichen Aufwand, der meist unnötig ist. [Ermittlung der String-Länge]
Ich sehe nicht, daß es garantiert in allen Fällen unnötig ist.
Nein, in allen nicht. Aber in dem, an dem sich diese Diskussion hier entzündete schon.
Das willst du alles hart kodiert in das Programm schreiben? Wie flexibel und gut wartbar ;-)
Dafür gibt's #defines.
Und jedesmal ein neuer Build, wenn sich irgendwo eine Länge ändert. Cool! Den Versionszähler kann man sich dann als Ventilator in die Küche hängen ;-)
Huh? Warum sollte sich die Länge so häufig ändern.
Das war ein Witz - deshalb auch der Smiley. Solche Längen werden sich nicht oft ändern, aber ab und zu schon. Wenn ich nur wegen der Verwendung solcher #defines in strncmp und Konsorten ständig neue Versionen bauen muss, ist das unnötig - das meinte ich damit. [...]
Man benutzt halt einen festgelegten Wert für die Allozierung und den gleichen Wert für die Begrenzung der strn*-Funktionen. Das ist auch kein geheimer Trick, sondern relativ naheliegend, darum kann das auch der Leser wissen.
Mir fehlte der Zusammenhang. Du hast sinngemäß geschrieben, dass dem Leser den Code dann übersichtlicher wird, wenn er sich nicht noch Gedanken darüber machen muss, ob wieder eine Funktion aus string.h *aus dem Ruder gelaufen ist*. Ich habe daraufhin erwidert, dass er sich da bei strncmp genausowenig wie strcmp sicher sein kann, es also keinen Unterschied macht. Wie man defines verwendet, ist mir schon klar ;-)
BTW: Gehen wir mal davon aus, dass strcmp() nicht bei 0 aufhört. Dann sollte man doch davon ausgehen, dass auch strncmp() nicht bei 0 aufhört, oder?
Man sollte nicht davon ausgehen, daß es nicht passiert. Wahrscheinlich ist es nicht.
Ja, hmm - äh wie nochmal? Stimmst Du mir zu oder behauptest Du, dass strncmp eine gänzlich andere Implementierung vorlegt als strcmp?
Dann müsste aber der folgende Code-Schnipsel ein ziemlich merkwürdiges Resultat ergeben:
Ich hab's nicht verstanden, was meinst Du?
Sorry, ich sah gerade, dass da noch eine Kleinigkeit fehlt, um meine
Argumentation verständlich zu machen, das ergänze ich hier mal. Ich
habe auch zum Vergleich noch die strcmp-Werte angehängt, um zu
zeigen, dass es keinen Unterschied macht (wäre ja auch schlimm in
diesem Fall).
<schnipp>
#include
Moin,
* Jan Trippler
On Sam, 03 Aug 2002 at 20:52 (+0200), Thorsten Haude wrote:
BTW: Gehen wir mal davon aus, dass strcmp() nicht bei 0 aufhört. Dann sollte man doch davon ausgehen, dass auch strncmp() nicht bei 0 aufhört, oder?
Man sollte nicht davon ausgehen, daß es nicht passiert. Wahrscheinlich ist es nicht.
Ja, hmm - äh wie nochmal? Stimmst Du mir zu oder behauptest Du, dass strncmp eine gänzlich andere Implementierung vorlegt als strcmp?
Ich vermute, daß die weitaus meisten Implementierungen am Ende des Strings aufhören, aber ich vermisse die eindeutige Aussage darüber. Bis dahin nehme ich lieber eine winzige Verzögerung in Kauf, als einen Bufferüberlauf.
Dann müsste aber der folgende Code-Schnipsel ein ziemlich merkwürdiges Resultat ergeben:
Ich hab's nicht verstanden, was meinst Du?
Sorry, ich sah gerade, dass da noch eine Kleinigkeit fehlt, um meine Argumentation verständlich zu machen, das ergänze ich hier mal.
Ich sehe wieder nur eine Bestätigung der Art und Weise, wie es die glibc macht (und wie man es machen sollte). Thorsten -- Why waste time learning, when ignorance is instantaneous? - Calvin
Thorsten Haude
Ich vermute, daß die weitaus meisten Implementierungen am Ende des Strings aufhören, aber ich vermisse die eindeutige Aussage darüber.
OK, du willst es formell? Das kannst du haben :-) Hier die
entsprechenden Auszüge aus ISO/IEC 9899:1999, besser bekannt als ISO
C99, sprich der derzeit gültige C Standard (ich könnte auch in dem
älteren ANSI C Standard nachschauen, aber da müsste ich erst suchen,
wo ich den habe, die ISO C 99 PDF-Datei ist direkt greifbar:).
Zuerst die Definition von String, Zeiger auf String und Stringlänge:
----------------------------------
7.1.1 Definitions of terms
A string is a contiguous sequence of characters terminated by and
including the first null character. The term multibyte string is
sometimes used instead to emphasize special processing given to
multibyte characters contained in the string or to avoid confusion
with a wide string. A pointer to a string is a pointer to its
initial (lowest addressed) character. The length of a string is the
number of bytes preceding the null character and the value of a
string is the sequence of the values of the contained characters, in
order.
----------------------------------
Und hier die Definition von strcmp:
----------------------------------
7.21.4.2 The strcmp function
Synopsis
#include
On Son, 04 Aug 2002 at 02:54 (+0200), Philipp Thomas wrote:
OK, du willst es formell? Das kannst du haben :-) Hier die entsprechenden Auszüge aus ISO/IEC 9899:1999, besser bekannt als ISO C99, sprich der derzeit gültige C Standard (ich könnte auch in dem älteren ANSI C Standard nachschauen, aber da müsste ich erst suchen, wo ich den habe, die ISO C 99 PDF-Datei ist direkt greifbar:). [...]
Danke! Jan
On Sun, 04 Aug 2002 at 02:54 (+0200), Philipp Thomas wrote:
Thorsten Haude
[4 Aug 2002 00:38:17 +0200]: Ich vermute, daß die weitaus meisten Implementierungen am Ende des Strings aufhören, aber ich vermisse die eindeutige Aussage darüber.
OK, du willst es formell? Das kannst du haben :-) Hier die entsprechenden Auszüge aus ISO/IEC 9899:1999, besser bekannt als ISO C99, sprich der derzeit gültige C Standard (ich könnte auch in dem älteren ANSI C Standard nachschauen, aber da müsste ich erst suchen, wo ich den habe, die ISO C 99 PDF-Datei ist direkt greifbar:).
Kann man sich die irgendwo herunterladen? Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Applaus: Rauschmittel, unter dessen Einwirkung Politiker sich zu den seltsamsten Erklärungen verleiten lassen. -- Ron Kritzfeld
Bernhard Walle
[ISO/IEC 9899:1999]
Kann man sich die irgendwo herunterladen?
Ja, aber nur gegen Bezahlung (AFAIR $20). Philipp -- Philipp Thomas work: pthomas@suse.de Entwicklung, SuSE Linux AG private: philippt@t-online.de
Hi, On Sun, 4 Aug 2002, Thorsten Haude wrote:
Ich vermute, daß die weitaus meisten Implementierungen am Ende des Strings aufhören, aber ich vermisse die eindeutige Aussage darüber.
ISO C99.
Bis dahin nehme ich lieber eine winzige Verzögerung in Kauf, als einen Bufferüberlauf.
str(n)cmp() greift ausschliesslich lesenderweise auf Strings zu, kann deshalb also per definitionem keinen Pufferueberlauf erzeugen. Wenn du glaubst, es gaebe strncmp(), um dies zu verhindern, dann hast du nicht verstanden, wozu strncmp() gut ist, bzw. was ein Pufferueberlauf ist. Ciao, Micha.
On Mon, 05 Aug 2002 at 14:54 (+0200), Michael Matz wrote:
On Sun, 4 Aug 2002, Thorsten Haude wrote:
Bis dahin nehme ich lieber eine winzige Verzögerung in Kauf, als einen Bufferüberlauf.
str(n)cmp() greift ausschliesslich lesenderweise auf Strings zu, kann deshalb also per definitionem keinen Pufferueberlauf erzeugen. Wenn du glaubst, es gaebe strncmp(), um dies zu verhindern, dann hast du nicht verstanden, wozu strncmp() gut ist, bzw. was ein Pufferueberlauf ist.
Naja, man kann z. B. durch einen lesenden Zugriff auf geschützte Speicherbereiche (verursacht durch fehlende Null-Terminierung) einen Speicherzugriffsfehler und damit die sofortige Beendigung des Programms verursachen. Allerdings muss vor jeglicher Anwendung einer str...-Funktion die Null-Terminierung sichergestellt werden! Gruß, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Ich weiß nicht, mit welchen Waffen wir im dritten Weltkrieg kämpfen werden, aber ich weiß, mit welchen im Vierten: mit Pfeil und Bogen. -- Albert Einstein
Hi, On Mon, 5 Aug 2002, Bernhard Walle wrote:
str(n)cmp() greift ausschliesslich lesenderweise auf Strings zu, kann deshalb also per definitionem keinen Pufferueberlauf erzeugen. Wenn du glaubst, es gaebe strncmp(), um dies zu verhindern, dann hast du nicht verstanden, wozu strncmp() gut ist, bzw. was ein Pufferueberlauf ist.
Naja, man kann z. B. durch einen lesenden Zugriff auf geschützte Speicherbereiche (verursacht durch fehlende Null-Terminierung) einen Speicherzugriffsfehler und damit die sofortige Beendigung des Programms verursachen.
Klar. Aber wie soll die fehlende null-Terminierung dahin kommen, wenn nicht durch einen Fehler. Der allerdings liegt dann nicht in str(n)cmp(). Ciao, Micha.
Moin,
bitte schick mir jede Mail nur einmal. Danke.
* Michael Matz
On Sun, 4 Aug 2002, Thorsten Haude wrote:
Ich vermute, daß die weitaus meisten Implementierungen am Ende des Strings aufhören, aber ich vermisse die eindeutige Aussage darüber.
ISO C99.
Jepp, das haben wir geklärt. Ich habe an akutem Stumpfsinn gelitten.
Bis dahin nehme ich lieber eine winzige Verzögerung in Kauf, als einen Bufferüberlauf.
str(n)cmp() greift ausschliesslich lesenderweise auf Strings zu, kann deshalb also per definitionem keinen Pufferueberlauf erzeugen.
Wie nennt man das, wenn man versucht, Speicherbereiche zu lesen, in denen man nichts zu suchen hat? Thorsten -- In dem Augenblick, wo wir anfangen unsere Freiheitsrechte einzuschränken, besorgen wir das Geschäft der Terroristen. - Günter Grass
participants (5)
-
Bernhard Walle
-
Jan.Trippler@t-online.de
-
Michael Matz
-
Philipp Thomas
-
Thorsten Haude