es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Supresión de Address Sanitizer para gtest

¿Es posible suprimir las funciones de pruebas unitarias? Tengo el analizador de direcciones en mi proyecto y estoy recibiendo informes con información sobre desbordamiento de búfer de pila, que quiero suprimir.

Ya hay una página de stackoverflow con un problema similar aquí, pero la solución para esta pregunta no es lo que quiero (no quiero desactivar la prueba).

Por ejemplo

TEST_F(classA, testA) {
some_struct a;
a.p = 100;
ASSERT_FALSE(&foo());
}

No quiero utilizar el analizador de direcciones en esta prueba. La prueba debe ejecutarse, pero no quiero tener ningún informe del analizador de direcciones.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible suprimir las funciones de prueba unitaria en googletest con address-sanitizer. Una forma de hacer esto es utilizando la bandera suppress-warnings -fsanitize-undefined-trap-on-error. Esta bandera desactiva el sanitizador de comportamientos indefinidos del compilador y en su lugar propaga el comportamiento indefinido a través de trampas de código.

    Sin embargo, es importante tener en cuenta que suprimir las advertencias puede no ser el mejor enfoque, ya que puede ocultar posibles errores en el código. Un enfoque mejor sería corregir los informes del address-sanitizer identificando y corrigiendo los problemas que causan el desbordamiento de búfer de pila.

    Si los informes del address-sanitizer ocurren en una función de prueba específica y no desea deshabilitar toda la prueba, puede envolver el código que causa el problema en un bloque #ifdef y compilar con una bandera que desactive el address-sanitizer solo para ese bloque de código específico.

    Por ejemplo:

    c++
    TEST_F(classA, testA) {
    #ifndef __SANITIZE_ADDRESS__
    some_struct a;
    a.p = 100;
    ASSERT_FALSE(&foo());
    #endif
    }

    Aquí, se utiliza la macro __SANITIZE_ADDRESS__ para desactivar únicamente el address-sanitizer para el bloque de código dentro de las directivas #ifndef y #endif.

    Es importante utilizar la compilación condicional con precaución y probar exhaustivamente el código en busca de problemas antes de lanzarlo a producción.

Comments are closed.