2011-01-24 9 views
14

¿Es posible que g ++ muestre un error al compilar el siguiente archivo con alguna bandera?¿Es posible activar la verificación de límites de matriz en g ++?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int arr[ 2 ]; 

    cout << arr[ 4 ] << endl; 

    return 0; 
} 

vi algunas cosas como gcc -Wall -O2 main.c que sólo trabaja con C, C++ no.

+1

'-Wall -Wextra -ansi -pedantic' no genera advertencias para este programa :( – EnabrenTane

Respuesta

3

Puede usar un analizador estático como Cppcheck. Cuando se ejecuta en el código anterior:

 
$ cppcheck --enable=all test.cpp 
Checking test.cpp... 
[test.cpp:6]: (style) Variable 'arr' is not assigned a value 
[test.cpp:8]: (error) Array 'arr[2]' index 4 out of bounds 

Puede integrar Cppcheck en su procedimiento de acumulación y considerar su código construido con éxito sólo si Cppcheck pasa.

0

Puede reemplazar las matrices con std::vector. Vector tiene función de miembro de acceso (std::vector::at) que hace la comprobación de límites en tiempo de ejecución.

La compilación del tiempo de compilación para el desbordamiento del búfer es un problema indecidible muy difícil, desafortunadamente. Por lo general, se maneja con una herramienta de análisis estático completo.

2

Recuerdo haber visto un gcc o g ++ mensaje de advertencia de ffmpeg o x264 lo largo de las líneas de

"índice de advertencia de matriz puede estar fuera de límites"

http://gcc.gnu.org/ml/gcc/2000-07/msg01000.html

parece que probablemente hizo en.

La restricción es que tiene un ejemplo como el anterior. tan pronto como tenga variables en lugar de literales, no será posible. excepto tal vez en un simple bucle.

+0

[Según Wikipedia] (https://en.wikipedia.org/wiki/AddressSanitizer), ffmpeg usa AddressSanitizer. podría ser su resultado. Más sobre AddressSanitizer [en una A a otra Q] (// stackoverflow.com/a/17637383/2157640). – Palec

3

Para las matrices primas, no creo que sí, porque -fbounds-check no funcionó con su ejemplo y MingW g ++ 4.4.1, y porque los viejos documentos 3.x que tengo dicen

-fbounds -check

para frontales que lo soportan, generar código adicional para comprobar que índices utilizados para matrices de acceso son dentro del intervalo declarado. Esto es actualmente solo es compatible con los front-ends Java y Fortran 77, donde esta opción se establece de manera predeterminada en verdadero y falso respectivamente.

Sin embargo, con std::vector puede utilizar at tener un poco práctico en tiempo de ejecución de comprobación de límites (genera una excepción). Y puede usar una versión de depuración especial de la biblioteca estándar, que proporciona una comprobación práctica de los límites en tiempo de ejecución para []. Por ejemplo, al compilar & hellip;

#include <iostream> 
#include <vector> 
using namespace std; 

int main() 
{ 
    vector<int> arr(2); 

    cout << arr[ 4 ] << endl; 
} 

& hellip; se obtienen diferentes, respectivamente, no la comprobación y el comportamiento de la comprobación de las versiones de lanzamiento y de depuración de la aplicación g ++ biblioteca estándar:

 
C:\test> g++ x.cpp & a 
4083049 

C:\test> g++ x.cpp -D _GLIBCXX_DEBUG -D _GLIBCXX_DEBUG_PEDANTIC & a 
c:\program files\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/debug/vector:265: 
    error: attempt to subscript container with out-of-bounds index 4, but 
    container only holds 2 elements. 

Objects involved in the operation: 
sequence "this" @ 0x0x22ff1c { 
    type = NSt7__debug6vectorIiSaIiEEE; 
} 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

C:\test> _ 

se informa de nuevos g ++ versiones (después de 4,0) que no necesitan el símbolo _GLIBCXX_DEBUG_PEDANTIC. Para más detalles, vea el GNU documentation.

Cheers & hth.,

+2

'{boost, std :: tr1, std} :: array' tiene' at' también. –

Cuestiones relacionadas