Este es un experimento mental, no un código de producción ni un buen estilo de codificación.
Supongamos que tenemos esta función
int find_process_pid_by_name(char* name, int* threads_in_process); que devuelven el PID de un proceso con nombre y también siempre almacenan en threads_in_process la cantidad de hilos que se ejecutan en dicho proceso.
Un programador perezoso, interesado solo en el PID , escribe este código
int pid = find_process_pid_by_name("a process name", &pid);¿Desencadena un comportamiento indefinido?
No, no creo que sea un comportamiento indefinido. Hay un punto de secuencia inmediatamente antes de que se llame a la función (después de que se hayan evaluado los argumentos y la expresión que denota la función llamada), y hay otro antes de que regrese la función llamada. Cualquier efecto secundario en pid realizado por la función llamada se ha completado antes de que la función termine de regresar. Luego, el resultado de la función se asigna a pid . No hay duda de que la función cambie la ubicación asignada. No veo nada que invoque un comportamiento indefinido.
Supongo que la función llamada trata el argumento int * como un puntero de solo escritura a un solo valor. Si se lee desde un solo valor, necesitamos saber que pid se inicializó previamente (formalmente; en la práctica, no importará). En el contexto, pid no se ha inicializado; el resultado de la función la inicializará. Entonces, si la función lee desde su argumento de puntero, técnicamente, tiene un comportamiento indefinido. Si la función trata el puntero como el inicio de una matriz de elementos múltiples y accede más allá del elemento cero, hay problemas. Pero estos son problemas algo fuera del alcance previsto de la pregunta/discusión.
Sí, creo que este código está bien definido. Hay un punto de secuencia al final de la función, antes de que el valor devuelto se copie en el contexto de llamada. Entonces, la función primero asignará a pid indirectamente a través de threads_in_process , luego regresará y luego el valor de retorno se asignará a pid .