2012-02-13 16 views
7

tengo la siguiente línea en mi programa que causa una advertencia de tiempo de ejecución:La declaración codificada std :: string provoca desbordamiento de búfer

if (!is_directory("C:\\NGFMS_Debug\\Files") && !create_directories("C:\\NGFMS_Debug\\Files")) 

El texto de la advertencia es tan así: "Se ha producido un desbordamiento del búfer en XXX.exe que ha dañado el estado interno del programa ".

La advertencia viene en la llamada a "is_directory (...)". Supongo que no se asigna el espacio para la cadena, pero pensé que la sintaxis era legal.

La función is_directory es una parte del impulso/filesystem.hpp y estoy usando los siguientes espacios de nombres:

using namespace boost; 
using namespace boost::filesystem; 
using namespace std; 

Esto se está poniendo compilado bajo VS2005 C++. ¿Algunas ideas?

actualización

he intentado un par de cosas diferentes y dio un paso a través del código y esto es lo que encontré.

Si hago esto

char* path_chars_c; 
path_chars_c = "C:\\Debug\\Files"; 
string path_str_c(path_chars_c); 

El path_chars_c variable contiene la secuencia apropiada, pero el path_str_c variable contiene la basura después de la inicialización. Entonces parece que la inicialización de la cadena está rota aquí. ¿Alguien ha visto esto alguna vez?

+0

Un desbordamiento de búfer no causa una excepción: si realmente está viendo una excepción, debe proporcionar más información. – ildjarn

+0

@ildjarn Estoy viendo un punto de interrupción de Windows, supongo. El mensaje ha cambiado en consecuencia. – Ian

+0

Estoy confundido. ¿Es esto una advertencia del compilador? Deberías publicar el mensaje textualmente. – Gabe

Respuesta

6

Este es un error sorprendente, que parece un uso bastante estándar de boost :: filesystem :: is_directory(). ¿Has intentado entrar en él con un depurador para ver dónde ocurre el problema?

Una posibilidad (remota) le viene a la mente: si está vinculando bibliotecas que tienen habilitado NDEBUG con bibliotecas que tienen desactivado NDEBUG, puede tener problemas. En particular, algunos tipos de datos de impulso asignarán algunos campos de depuración adicionales cuando la depuración esté activada. Entonces, si un objeto es creado por una pieza de código que cree que la depuración está desactivada, pero luego es utilizada por otra parte del código que cree que la depuración está activada, entonces puede obtener errores de memoria aleatorios (como desbordamientos de búfer).

+0

Guau, eso fue una gran conjetura. Asegurándose de que todo estaba compilado en modo DEPURACIÓN lo solucionó. – Ian

Cuestiones relacionadas