strcmp () gibt verschiedene Werte für dieselben Zeichenfolgenvergleiche zurück

8
%Vor%

Warum gibt strcmp verschiedene Werte zurück, wenn er dieselben Parameter empfängt?

Diese Werte sind immer noch zulässig, da die Manpage von strcmp angibt, dass der Rückgabewert von strcmp kleiner, größer oder gleich 0 sein kann, aber ich verstehe nicht, warum sie in diesem Beispiel anders sind.

    
Bilow 12.10.2015, 22:40
quelle

2 Antworten

4

Ich gehe davon aus, dass Sie GCC verwenden, wenn Sie das kompilieren, ich habe es am 4.8.4 versucht. Der Trick dabei ist, dass GCC die Semantik bestimmter Standardbibliotheksfunktionen versteht ( strcmp ist einer davon). In Ihrem Fall wird der Compiler den zweiten strcmp -Aufruf vollständig eliminieren, da er weiß, dass das Ergebnis von strcmp bei den String-Konstanten "0" und "9" negativ ist und ein standardkompatibler Wert (-1) verwendet werden, anstatt den Anruf zu tätigen. Beim ersten Aufruf kann das nicht der Fall sein, weil s1 und s2 möglicherweise im Speicher geändert wurden (stellen Sie sich einen Interrupt vor, oder mehrere Threads, etc.).

Sie können ein Experiment durchführen, um dies zu überprüfen. Fügen Sie den Arrays das Qualifikationsmerkmal const hinzu, damit GCC weiß, dass sie nicht geändert werden können:

%Vor%

Sie können auch die Assembler-Ausgabe des Compilers betrachten (verwenden Sie das -S -Flag).

Der beste Weg zur Überprüfung ist jedoch die Verwendung von -fno-builtin , wodurch diese Optimierung deaktiviert wird. Mit dieser Option wird der ursprüngliche Code in beiden Fällen -9 ausgegeben.

    
Geza Lore 12.10.2015, 22:58
quelle
3

Der Unterschied liegt in der Implementierung von strcmp. Solange es dem (& lt; 0, 0, & gt; 0) entspricht, sollte es für den Entwickler keine Rolle spielen. Du kannst dich nicht auf etwas anderes verlassen. Nach allem, was Sie wissen, könnte der Quellcode bestimmen, dass er negativ sein sollte, und zufällig eine negative Zahl erzeugen, um Sie auszuschalten.

    
ergonaut 12.10.2015 22:52
quelle