Auditoría de SQLite con tis-interpreter: el peine fino del comportamiento indefinido

Fuentes: SQLite with a Fine-Toothed Comb

El autor, ingeniero de Trust-in-Soft, describe el trabajo de auditoría estática realizado sobre SQLite, una base de datos ligera de alrededor de 113.000 líneas de código con uso intensivo de punteros, demasiado extensa para una verificación estática trivial pero respaldada por una de las suites de pruebas más exhaustivas del mundo del software libre. El análisis se ha llevado a cabo con tis-interpreter, una herramienta derivada de métodos formales formalmente rigurosos, más lenta que Valgrind y con limitaciones frente a bibliotecas compiladas por separado o llamadas al sistema como mmap. Aun partiendo de código que pasa los filtros de ASan y UBSan, el intérprete detecta un conjunto de comportamientos indefinidos (UBs) que estas herramientas no capturan.

El artículo repasa cinco categorías de problemas hallados. La primera son los punteros colgantes: SQLite los emplea sin dereferenciarlos en varios puntos del código; no se ha demostrado que los compiladores actuales los exploten, pero se trata de un UB técnicamente fácil de eliminar. La segunda categoría corresponde a lecturas de memoria no inicializada, incluida una práctica destinada a silenciar avisos del compilador sobre valores de retorno ignorados, y al menos una lectura potencialmente peligrosa no detectada por Valgrind. La tercera afecta a punteros fuera de límites, como el truco de indexación con base 1 del array aMem del struct vdbe, resuelto reordenando campos o reservando un elemento adicional. La cuarta engloba llamadas a memset() y memcpy() con argumentos puntero no válidos o nulos, casos en los que GCC ya aplica optimizaciones agresivas. La quinta trata de comparaciones entre punteros a objetos distintos, para las que SQLite ha adoptado la macro SQLITE_WITHIN, que convierte los punteros a uintptr_t y restaura la determinismo.

El post cierra con una reflexión sobre el concepto de "Friendly C", un dialecto que legitimaría algunas de estas prácticas o contaría con mejor soporte de herramientas para detectarlas. La auditoría, más allá de sus hallazgos, sirve también para identificar puntos de fricción en el propio tis-interpreter y orientar su evolución.