leak check valgrind address-sanitizer memory-sanitizer

check - Memoria/desinfectante de direcciones vs Valgrind



valgrind memory leak check (1)

Quiero una herramienta para diagnosticar errores de usuario después de gratuitos y errores sin inicializar. Estoy considerando desinfectar (memoria y / o dirección) y Valgrind. Pero tengo muy poca idea sobre sus ventajas y desventajas. ¿Alguien puede decir las características principales, las diferencias y las ventajas y desventajas de Sanitizer y Valgrind?

Edición: encontré algunas de las comparaciones como: Valgrind usa DBI (instrumentación binaria dinámica) y Sanitizer usa CTI (instrumentación en tiempo de compilación). Valgrind hace que el programa sea mucho más lento (20x) si Sanitizer se ejecuta mucho más rápido que Valgrind (2x). Si alguien me puede dar algunos puntos más importantes para considerar, será de gran ayuda.


Creo que encontrarás este wiki útil.

Las principales ventajas de los desinfectantes TLDR son:

  • gastos generales de CPU mucho más pequeños (Lsan es prácticamente libre, UBsan es 1.25x, Asan y Msan son 2-4x para tareas de computación intensivas y 1.05-1.1x para GUIs, Tsan es 5-15x)
  • clase más amplia de errores detectados (apilamiento y desbordamientos globales, uso después de retorno)
  • soporte completo de aplicaciones de subprocesos múltiples (el soporte de Valgrind para subprocesos múltiples es una broma)

Las desventajas son

  • sobrecarga de memoria significativa (hasta 2x para Asan, hasta 3x para Msan, hasta 10x para Tsan) que puede ser un factor limitante para entornos con recursos limitados (por ejemplo, teléfonos); sigue siendo mucho mejor que Valgrind
  • integración más complicada (debe enseñar a su sistema de compilación a comprender Asan y, a veces, evitar las limitaciones / errores en el propio Asan, también necesita usar un compilador relativamente reciente)
  • MemorySanitizer no es realmente fácil de usar en este momento ya que requiere uno para reconstruir todas las dependencias bajo Msan (incluidas todas las bibliotecas estándar, por ejemplo, libstdc ++); esto significa que los usuarios ocasionales solo pueden usar Valgrind para detectar errores no inicializados
  • los desinfectantes normalmente no se pueden combinar entre sí (la única combinación compatible es Asan + UBsan + Lsan), lo que significa que tendrá que hacer ejecuciones de control de calidad separadas para detectar todos los tipos de errores