2016-04-19 5 views
6

Ich schreibe ein Test-Framework und in main() gebe ich die Anzahl der fehlgeschlagenen Tests zurück. Zum Beispiel:Kann der Exit-Code eines Prozesses für kleine Werte überlaufen?

int main() { 
    int failedTests = runTests(); 
    return failedTests; 
} 

Also kann dieser "int" Überlauf? Kann ich %ERROR_LEVEL% als == 0 erhalten, wenn ich tatsächlich etwas anderes als 0 zurückgegeben habe? Kommt es auf das Host-Betriebssystem an? Was sind die üblichen Maximalwerte? Kann ich sicher sein, dass eine Ganzzahl < 32768 (2^16 - ein kurzer) immer passt?

EDIT:

Ich habe sys.exit Probleme mit Python hatte, die den Bereich von 0-127 verwendet (fast) immer so bin ich vorsichtig jetzt

+0

'% ERROR_LEVEL%' gilt das nicht für eine Windows 'cmd' Shell? Für 'bash' verwendest du' $? 'IIRC. –

+0

@ πάνταῥεῖ ja - meine Frage ist für alle Plattformen - jede Information ist nützlich – onqtam

+0

Wenn Sie den letzten Rückgabewert des Programms in bash oder ähnlichem bekommen wollen, benutzen Sie '$?', Das ist korrekt. – Leandros

Antwort

4

Es hängt vom Betriebssystem ab. Unter Linux ist es auf 8 Bits beschränkt, kann also 0 (für Erfolg) oder eine beliebige positive ganze Zahl nicht größer als 255 sein. Siehe & wait(2).

Nur zwei Werte sind standardisiert (namentlich): EXIT_SUCCESS (normalerweise ist es 0) und EXIT_FAILURE (oft wie 1). Beachten Sie, dass der Standard den Namen (und wahrscheinlich auch das Verhalten von exit(0); ...) definiert, aber nicht deren Wert.

Sie könnten die Nummer (von fehlgeschlagenen Tests) in stdout oder in eine Datei schreiben, die durch ein Programmargument angegeben wurde.

FreeBSD hat in seiner sysexits(3) eine Reihe von Exit-Namen und -Codes definiert, die jedoch nicht standardisiert sind, z. in POSIX. Siehe POSIX documentation on exit.

+0

** FALSCH! ** Weder "EXIT_SUCCESS" noch "EXIT_FAILURE" sind Werte angehängt. Ihre Werte sind implementierungsdefiniert. Während '0' eine erfolgreiche Programmausführung anzeigt, ist es nicht erforderlich, dass 'EXIT_SUCCESS' auch gleich '0' ist. – Leandros

+0

@Leandros - sie sind keine Implementierung definiert. Sie sind einfach durch die Implementierung definiert. "Implementation-Defined" hat eine besondere Bedeutung im Standard: Wenn ein Verhalten implementiert ist, muss die Implementierung Ihnen sagen, was es tut. –

+0

@Leandros - nein. "EXIT_SUCCESS" und "EXIT_FAILURE" haben bereits ein definiertes Verhalten: Der Standard sagt, was sie tun. Es besteht keine Verpflichtung für die Implementierung, zu sagen, was diese Namen tun. Die ** Werte ** mögen durchaus implementierungsspezifisch sein, aber die ** Effekte ** der Verwendung dieser Namen sind ** nicht ** implementiert. –

3

Ja, es wie jedes andere int überlaufen kann . Der Standard beschreibt int mit mindestens 16 Bit Breite. Alles zurückgeben, was nicht in ein int passt, ist undefiniertes Verhalten.

Die Umgebung, in der das C++ - Programm ausgeführt wird, tut dies mit dem Wert, ist implementiert und nicht im Standard beschrieben.

Drei Werte werden vom C++ - Standard erwähnt: EXIT_SUCCESS, EXIT_FAILURE und 0. Sowohl 0 als auch EXIT_SUCCESS zeigen eine erfolgreiche Programmausführung an, während die andere einen Fehler definiert. EXIT_SUCCES muss nicht null sein.

den C++ 11 Standard Zitiert:

Wenn Status Null oder EXIT_SUCCESS ist, eine Implementierung definierten Form des Status erfolgreiche Beendigung zurückgeführt wird. Wenn der Status EXIT_- FAILURE ist, wird eine implementierungsdefinierte Form des Status fehlgeschlagene Beendigung zurückgegeben. Andernfalls wird der Status von Implementierung zu Implementierung umsetzungs defined.225

Die üblichen Werte variieren unterstützt zurückgegeben wird, verwendet Windows volle 32-Bit-Integer als Rückgabewert, und die vollen 32 Bits können durch verschiedene Mittel erreicht werden. POSIX gibt nur an, wie die 8 Bits niedriger Ordnung erhalten werden können, und daher schneiden die Shells häufig die zurückgegebenen Werte ab.

+0

Downvoter Pflege zu erklären? – Leandros