2012-08-15 21 views
7

Instalé la herramienta Cppcheck para el análisis de código estático de mi proyecto C++ y tuve la sensación de que funciona mal. Por ejemplo, ¿alguien puede decirme por qué Cppcheck no puede encontrar un error de matriz fuera de límites en el siguiente código?¿Por qué Cppcheck no encuentra este error obvio de matriz fuera de límites?

void f(int c) { 
    char *p = new char[10]; 
    p[c] = 42; 
} 

void g() { 
    f(100); 
} 

Hay un online demo donde este código puede ser convenientemente comprobada usando Cppcheck. Todo lo que se trata es una fuga de memoria en la línea 4, no hay señales de un posible desbordamiento del búfer.

+2

Me he dado cuenta de que su pregunta ya ha sido publicado y comentado en el foro cppcheck. El comentario parece implicar que este tipo de comprobación de límites aún no es compatible. Sería mejor preguntar esto más en ese foro. –

+1

porque ninguna herramienta podría encontrar todos los errores, y especialmente cppcheck no analiza y evalúa completamente C++, pero contiene muchos accesos directos que permiten detectar solo la mayoría de los errores locales. – PlasmaHH

+2

Describe los pasos necesarios para que la herramienta pueda detectar el error. A continuación, enumere los casos en los que aparecerán falsos positivos. Luego intenta imaginar a los desarrolladores sentados y sopesando estas cosas. – HonkyTonk

Respuesta

9

Porque no es compatible actualmente.

Esto no es un error obvio para el compilador. Algo así como

char c[5]; 
for (int i=0; i<10; ++i) 
    c[i] = 0; 

es más obvio, ya que todo está en el mismo código.

Algo así como

#define f(c) { \ 
    char *p = new char[10]; \ 
    p[c] = 42; \ 
} 

void g() { 
    f(100); 
} 

es más evidente, porque cppcheck y el compilador se expanden todas las macros en el lugar antes de los cheques reales.

Sin embargo, su código publicado no es trivial, porque tanto cppcheck como el compilador necesitan todo el código dentro de esa función y lo evalúan con respecto al parámetro. Por supuesto, es posible si la función está a la vista (se vuelve bastante difícil, hasta imposible, entre unidades de traducción), pero ahora mismo, cppcheck no tiene esa característica.

9

Soy un desarrollador de Cppcheck.

No es por diseño que Cppcheck no puede detectar eso.

Actualmente, Cppcheck no evalúa las funciones utilizando todos los parámetros dados de todas las llamadas a funciones. Tenemos entradas sobre esto y espero que se solucione algún día. Sería bueno.

Si utiliza Cppcheck, no debería pensar que detectará todos los errores. Es probable que Cppcheck no detecte la mayoría de los errores. No existe un método en mi humilde opinión que detecte todos los errores en su software. Use Cppcheck solo para detectar algunos de los errores que no puede detectar de otra manera. Reduce el número de errores de alguna manera.

Espero que no estés muy decepcionado y sigas usando Cppcheck.

+3

Lo sentimos, pero * es * por diseño que CppCheck no puede detectar el problema de OP. CppCheck está * diseñado * para producir un flujo de tokens de idioma y aplica "patrones" para verificar si existen problemas en los tokens. Pero un tokenizador no tiene una comprensión real de la información de tipo en el idioma y, por lo tanto, no puede hacer ninguna comprobación relacionada con el "tipo". Por supuesto, con suficiente energía, uno podría agregar todo ese tipo de información mediante el procesamiento de los tokens, pero para entonces ya tienes la interfaz completa de C++ y eso no parece estar en la ambición de CppCheck. Esta herramienta simplemente no puede llegar muy lejos en serio análisis estático. –

+3

No estoy decepcionado con Cppcheck, es un gran proyecto de código abierto. Simplemente no sabía sus limitaciones lo suficientemente bien. Gracias por las explicaciones. – dokaspar

4

La última versión de Cppcheck 1,70 dev es capaz de detectar este error:

$ cppcheck test.cpp 
Checking test.cpp... 
[test.cpp:3]: (error) Array 'p[10]' accessed at index 100, which is out of bounds. 
[test.cpp:4]: (error) Memory leak: p 
+1

¿Este ejemplo tiene la función en el mismo archivo o funciona con la función en un archivo y la llamada a la función en otro archivo? –

+1

Este es un buen punto. De acuerdo con mis pruebas [aquí] (https://github.com/orbitcowboy/Stackoverflow_Question_11966613), el problema de acceso de memoria intermedia fuera de límites solo es detectado por cppcheck si el código reside en el mismo archivo. – orbitcowboy

Cuestiones relacionadas