2015-07-16 8 views
11

Dies ist ein Gedankenexperiment, nicht Produktionscode oder guter Codierungsstil.Hat dieser C-Code ein definiertes Verhalten?

Angenommen, wir haben diese Funktion

int find_process_pid_by_name(char* name, int* threads_in_process); 

, die die PID eines benannten Prozess und auch immer speichern in threads_in_process die Anzahl der Threads ausgeführt wird in dem Prozess zurückzukehren.

Ein fauler Programmierer, interessiert nur auf dem PID, schreibt diesen Code

int pid = find_process_pid_by_name("a process name", &pid); 

es nicht definiertes Verhalten auslösen Hat?

+0

Ich denke, wenn Sie auf 'threads_in_process [i], i = 1,2,3..' in Ihrer Funktion' find_process_pid_by_name' zugreifen, wird dies undefiniertes Verhalten sein! – user007

+0

Es ist gut definiert. Wie in den Antworten erwähnt, gibt es einen Sequenzpunkt direkt vor der Rückkehr der Funktion, was bedeutet, dass irgendwelche früheren Nebenwirkungen stattgefunden haben. –

+1

Genaugenommen übergeben Sie ein 'const char *' an eine Funktion, die ein 'char *' braucht; Wenn die Funktion ändert, was passiert ist, erhalten Sie undefiniertes Verhalten. –

Antwort

10

Nein - ich glaube nicht, dass es ein undefiniertes Verhalten ist. Es gibt einen Sequenzpunkt unmittelbar bevor die Funktion aufgerufen wird (nachdem die Argumente und der Ausdruck, der die aufgerufene Funktion bezeichnet, ausgewertet wurden), und es gibt noch einen anderen, bevor die aufgerufene Funktion zurückkehrt. Alle von der aufgerufenen Funktion ausgeführten Nebenwirkungen auf pid wurden beendet, bevor die Funktion beendet wird. Das Ergebnis der Funktion wird dann pid zugewiesen. Der Standort, der von der Funktion geändert wird, ist keine Frage. Ich sehe nichts, was zu undefiniertem Verhalten führt.

Ich nehme an, dass die aufgerufene Funktion das int * Argument als schreibgeschützten Zeiger auf einen einzelnen Wert behandelt. Wenn es von einem einzelnen Wert liest, müssen wir wissen, dass pid zuvor initialisiert wurde (formal; in der Praxis ist es egal). In diesem Zusammenhang wurde pid nicht initialisiert; Das Ergebnis der Funktion wird es initialisieren. Also, wenn die Funktion von ihrem Zeigerargument liest, haben Sie technisch undefiniert Verhalten. Wenn die Funktion den Zeiger als Start eines Arrays mit mehreren Elementen behandelt und auf das nullte Element zugreift, treten Probleme auf. Aber das sind Fragen, die etwas außerhalb des beabsichtigten Bereichs der Frage/Diskussion liegen.

1

Ja, ich glaube, dass dieser Code gut definiert ist. Es gibt einen Sequenzpunkt am Ende der Funktion, bevor der Rückgabewert in den aufrufenden Kontext kopiert wird. Also wird die Funktion zuerst pid indirekt über threads_in_process zuweisen, dann wird es zurückkehren, und dann wird der Rückgabewert pid zugewiesen.

Verwandte Themen