trevor chupetón
Sonido metálico tiene varios desinfectantes que se pueden activar para detectar problemas en tiempo de ejecución.
Sin embargo, hay algunos desinfectantes que no puedo usar juntos. ¿Porqué es eso?
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=address -o main main.cpp 1
clang: error: invalid argument '-fsanitize=address' not allowed with '-fsanitize=memory'
No es un gran problema, pero cuando ejecuto mis pruebas unitarias, toma más tiempo del que debería, porque he creado varios archivos binarios para las mismas pruebas y ejecuto cada uno de ellos por separado.
clang++-3.9 -std=c++1z -g -fsanitize=address -o test1 test.cpp
clang++-3.9 -std=c++1z -g -fsanitize=memory -fsanitize=undefined -o test2 test.cpp
Creo que el problema es que tanto Asan como Msan quieren controlar el montón, y ambos quieren reservar una gran cantidad de memoria para usar como “memoria oculta” que rastrea las asignaciones y el uso de la memoria que usa su programa.
Ambos no pueden estar activos porque estarían tratando de rastrear la memoria que está utilizando el otro desinfectante (que puede no parecer “seguro” de acuerdo con las reglas que verifica el desinfectante).
También daría como resultado un uso de memoria loco, porque ambos desinfectantes asignarían memoria adicional para rastrear cada byte que usa su programa.
Tal vez, en teoría, podrían rediseñarse para compartir un marco común para que puedan cooperar y no chocar, pero probablemente haya muy buenas razones prácticas por las que eso sería difícil o perjudicaría el rendimiento.
Fue una decisión de diseño separar Address Sanitizer y Memory Sanitizer para disminuir el tiempo de ejecución general en comparación con herramientas como MemCheck y Dr. Memory, que se enfocan en problemas de direccionamiento y uso de memoria no inicializada al mismo tiempo. Según los desarrolladoresmanejar estos dos tipos de problemas juntos genera más gastos generales que ejecutar ASan y MSan uno tras otro.
-
A diferencia de la respuesta altamente votada, esta cita una buena fuente en lugar de especular.
– julaine
3 de mayo a las 9:47
Supongo que parte de la instrumentación simplemente no es compatible; por ejemplo, la instrumentación para un desinfectante daría como resultado falsos positivos o falsos negativos en el otro. Pero también estaría muy interesado en los detalles técnicos.
– Mike MB
1 mayo 2016 a las 21:18
“cuando ejecuto mis pruebas unitarias, toma más tiempo del que debería” -> parece que no estás usando
-O
.-O1
es seguro de usar con el desinfectante de memoria y no dañará los seguimientos de pila (aparte de las llamadas de cola)– virraptor
2 de mayo de 2016 a las 0:55
@viraptor Gracias, ese es un buen punto. También me refería al tiempo de compilación real. Creación de múltiples binarios para probar los mismos componentes de software.
– Trevor Hickey
2 de mayo de 2016 a las 1:41