La comprobación correcta, una fase demasiado tarde
La entrada de la semana pasada terminaba con una apuesta: el arreglo está desplegado, nadie jugó una partida con él, y si el crash vuelve, la teoría está muerta. Volvió el 1 de septiembre a las diez y cinco de la noche, a los siete minutos de sesión, en la misma dirección del motor de física que otros tres crashes anteriores. Así que la teoría está muerta. Esto es lo que la mató.
La comprobación en sí no estaba mal, y se queda. Antes de tocar un auto, ahora le preguntamos al mundo si ese auto sigue enganchado a él, en vez de preguntarle al script si su referencia al auto todavía existe. Son preguntas distintas, y solo la primera dice algo sobre el cuerpo físico que estás a punto de leer. Lo que estaba mal era dónde la puse. Los seis lugares donde la conecté leen el auto durante una persecución. Y según el propio reporte del jugador, el crash llegó justo al entrar en el radio de la llamada, que es antes de que exista persecución alguna. Había puesto la protección aguas abajo del daño y después me quedé esperando a que atrapara algo que pasaba aguas arriba.
Es la tercera vez en dos días que el bug tiene exactamente esta forma, y vale la pena ponerle nombre, porque nunca es la que espero. Nunca es código que falta. Es una comprobación correcta conectada en uno solo de los varios lugares que la necesitaban. Una función auxiliar tenía cinco puntos de llamada que necesitaban la comprobación y uno que la tenía. Otra, dos y uno. Esta, siete y uno. Buscar ese patrón, una comprobación en una sola llamada de muchas, rindió más esta semana que buscar cualquier cosa nueva.
Así que el nuevo sospechoso es la llegada, y en concreto la única llamada de esa fase que mueve un cuerpo por teletransporte: sentar al sospechoso al volante de un auto que quizá todavía se está cargando. Esa llamada corría seis décimas de segundo después de que el juego avisara de la aparición, sobre un auto y un sospechoso buscados por etiqueta y comprobados con la más débil de las dos preguntas. Exactamente el error de arriba, una fase antes. Ahora hace la pregunta buena: sobre el auto, sobre el sospechoso y sobre si alguno de los dos sigue a mitad de su aparición.
Además reintenta en vez de cancelar, y eso importa más de lo que parece. Esas seis décimas eran una espera fija, no la confirmación de nada. Negarse sin más a sentarlo cuando los dos no están listos habría cambiado un crash por un callout que muere en silencio, y ese es un bug peor, porque nadie lo reporta. Ahora lo intenta cuatro veces a lo largo de tres segundos antes de rendirse.
Y tengo que ser honesto sobre lo que demostró la noche siguiente: nada. El juego no se cayó, pero el sistema de aparición del propio juego aceptó el auto al primer intento, así que el camino donde vive este arreglo, el de respaldo para cuando ese primer intento falla, nunca llegó a ejecutarse. Que el juego no se caiga no prueba que una comprobación funcione si la comprobación nunca corrió. Para probarla tengo que forzar ese camino de respaldo a propósito.
De la misma sesión salieron dos cosas más pequeñas, las dos sobre el log y no sobre el juego. El archivo de telemetría no escribe nada en el disco hasta que el juego se cierra limpio: cero bytes durante la partida, cuarenta y cinco kilobytes a los pocos segundos de salir por el menú. O sea que cada crash se lleva consigo el final de su propio registro, y la única sesión que puedes leer es la que terminas tú. Y hay una frase de la semana pasada que tiene que irse. Escribí que las diez llamadas a las que les había puesto líneas de log cerraron limpias, así que ninguna era la asesina. Cierto, y no significaba nada: de las dieciocho marcas de rastro del log, solo una estaba en el camino de la llegada. Había absuelto a un sospechoso al que nunca interrogué.