Los mismos pocos errores ocultos en tus librerías de confianza

Dedico tiempo a enviar pequeñas correcciones a grandes repositorios como Langchain, Vite y Bat.

Estos proyectos utilizan diferentes lenguajes y diferentes dominios. Los mantenedores son expertos.

Lo sorprendente no es el número de errores. Son los patrones. La mayoría de los errores tienen las mismas formas, solo que con diferentes ropajes.

Una vez que identificas estas formas, puedes detectarlas antes de que lleguen a producción. Aquí tienes cinco patrones comunes que encuentro:

  • Claves de entrada incorrectas En Langchain, una función de renombrado buscaba una clave llamada old_path. El sistema en realidad enviaba una clave llamada path. El código fallaba. Por qué sobrevive a la revisión: La prueba unitaria pasó porque el desarrollador construyó manualmente la entrada que la función esperaba, no la entrada que el sistema envía realmente. La comprobación: Si una función lee una clave, busca dónde se construye ese objeto. Si nada establece esa clave, has encontrado un error. Realiza pruebas con el llamador real.

  • Trampas de 'truthiness' Un error común es usar una comprobación de 'truthiness' cuando lo que quieres decir es "¿está definido este valor?". Ejemplo: const clause = defaultValue ? DEFAULT ${defaultValue} : ''; Si el valor es 0, el código se salta la rama. 0 es un valor real, pero es "falsy". La comprobación: Prueba siempre con 0, cadenas vacías y false. Si tu código no puede distinguir entre "ausente" y "presente pero cero", está roto.

  • Subdesbordamiento (underflow) de enteros sin signo En el proyecto Bat, se utilizaban cálculos matemáticos para calcular el ancho de la terminal. Si el ancho era demasiado pequeño, la resta resultaba en un underflow. En tipos sin signo, esto se convierte en un número masivo o provoca un error. La comprobación: Cualquier resta en un tipo sin signo que utilice la entrada del usuario necesita una resta saturante. Prueba con 0 y 1.

  • Codificación y casos límite Las reglas de texto parecen simples hasta que ves caracteres que no son ASCII. Mistune tenía problemas con delimitadores apilados que un generador podría producir. Wenmode fallaba al manejar marcas de combinación Unicode. Por qué sobrevive a la revisión: El ASCII pasa todas las pruebas. Los errores solo aparecen con entradas que no escribes a mano. La comprobación: Utiliza una prueba diferencial. Compara tu salida con una implementación diferente y probada.

  • Análisis (parsing) inseguro Vite tenía un middleware que decodificaba URLs sin una protección. Una URL malformada lanzaba un URIError y hacía fallar el middleware. La comprobación: Cualquier cosa que decodifiques o analices y que no hayas creado tú mismo necesita un bloque try/catch. Lanza cadenas rotas a tu código para ver si se dobla o se rompe.

Mi hábito es sencillo. Cuando corrijo un error, miro el código que está justo al lado. Si un manejador tiene un error, es muy probable que el manejador hermano tenga la misma forma.

Fuente: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp