Pregunta

La herramienta de análisis estático utilizamos está decayendo código C similar a la siguiente como un desbordamiento de memoria crítico.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

mensaje de error de la herramienta es: Buffer Overflow (Array Índice fuera de límites.): El array 'buf' tamaño es 1. array 'buf' puede utilizar el índice 0..64

Es esto legítimo? ¿La asignación de la matriz de caracteres en la cadena vacía realmente como resultado de su longitud se reduzca a un solo byte, como si se define como char buf [] = "";?

¿Fue útil?

Solución

La asignación de "" para buf [size + 1], no se reinicia el tamaño de buf, pero no tiene sentido, ya que está duplicando una pequeña parte de lo que hace el memset posterior (y que confunde a su herramienta de análisis estático - es posible desee presentar un informe de error contra ella).

Otros consejos

Aparte del hecho de que Char buf [tamaño + 1] no se compilará porque el tamaño es un valor de tiempo de ejecución, suponiendo que podría construir buf como una matriz de tamaño 65, a continuación, memset (buf, 0, 65) no sería una Desbordamiento.

Las probabilidades son su herramienta es confundido por sus problemas sintácticos.

[Editar: más información]

Sobre la base de los comentarios a mi post original, sugiero lo siguiente:

#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);

Creo que Rob Kennedy es correcta; su herramienta está utilizando el valor de cadena inicializador vacío como el tamaño de la matriz en lugar de la declaración de matriz estática.

No es un desbordamiento de memoria.

Esta es probablemente una manera más clara para hacerlo. Ciertamente se necesita menos líneas de código.

#define size 64
char buf[size + 1] = {0};

Es legal - el tampón es lo suficientemente grande. La herramienta que está advirtiendo que size_t podría ser más grande que int e intentar utilizarlo como indexador puede dar lugar a resultados impredecibles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top