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.

¿Cómo obtengo un error de `pop_back()` si `size()` es 0?

Estaba explicando a un compañero por qué hacemos pequeñas pruebas con saneadores. Preguntó acerca de si sacar un vector demasiadas veces causaría una excepción, assert, o UB y qué saneador lo detectaría.

Parece que NINGUNO los detecta. Address y memory los detectarán si llamas a back() después de sacar demasiadas veces, pero si sacas y haces size(), obtienes un valor no válido debido a la envoltura.

¿Existe alguna manera de obtener un assert, excepción o terminación en tiempo de ejecución cuando saco demasiadas veces? Realmente pensé que una construcción de depuración sin saneadores lo hubiera detectado (con un assert o excepción).

Uso el saneador clang pero las opciones de compilación con gcc también serán útiles.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, parece que no hay un mecanismo integrado en C++ para atrapar errores como el exceso de eliminación de vector. Como mencionaste, llamar a back () después de haber eliminado demasiadas veces puede activar AddressSanitizer o MemorySanitizer, pero estos sanitizadores no están diseñados específicamente para detectar este tipo de error.

    Una posible solución es agregar manualmente una afirmación o excepción en su código para verificar este error. Por ejemplo, podría agregar una verificación antes de eliminar el vector para asegurarse de que el vector no esté vacío. Si lo está, puede lanzar una excepción o usar assert () para terminar el programa.

    Otra opción es usar una biblioteca o herramienta que proporcione controles adicionales para las operaciones de vector. Por ejemplo, la biblioteca Microsoft GSL (Guideline Support Library) proporciona una clase gsl::span que proporciona comprobaciones de límites para matrices y vectores. Otras bibliotecas, como Boost, también pueden proporcionar funcionalidad similar.

    En cuanto a las opciones de compilación, es posible que desee considerar activar opciones de verificación de errores o advertencias adicionales en su compilador. Por ejemplo, con GCC puede activar la bandera -Werror para tratar las advertencias como errores, o usar la bandera -fsanitize=undefined para habilitar controles adicionales para el comportamiento indefinido. Clang también tiene opciones similares, como -Werror y -fsanitize=undefined.

    En resumen, aunque no hay un mecanismo integrado para detectar errores como la eliminación excesiva de vector, hay varias opciones disponibles para agregar controles adicionales a su código o habilitar una verificación de errores adicional en su compilador.

Comments are closed.