2011-01-24 11 views
14

Czy jest możliwe, aby g ++ pokazywał błąd podczas kompilowania następującego pliku z flagą?Czy jest możliwe włączenie sprawdzania granic tablicy w g ++?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int arr[ 2 ]; 

    cout << arr[ 4 ] << endl; 

    return 0; 
} 

Widziałem niektóre rzeczy, takie jak gcc -Wall -O2 main.c, które działa tylko z C, a nie C++.

+1

'-Wall -Wextra -ansi -pedantic' nie generują ostrzeżenia dla tego programu :( – EnabrenTane

Odpowiedz

3

Można użyć analizatora statycznego, takiego jak Cppcheck. Po uruchomieniu na powyższym kodzie:

 
$ 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 

można zintegrować Cppcheck w swojej procedurze budowlanej i rozważyć kod zbudowany z powodzeniem tylko wtedy, gdy Cppcheck przechodzi.

0

można zastąpić tablice z std::vector. Wektor ma funkcję składnika akcesora (std::vector::at), która sprawdza granice w czasie wykonywania.

Sprawdzanie czasu kompilacji dla przepełnienia bufora jest niestety bardzo trudnym problemem nierozstrzygalnym. Zwykle jest obsługiwane przez pełne narzędzie analizy statycznej.

2

Pamiętam widząc gcc lub g ++ komunikat ostrzegawczy z ffmpeg lub x264 wzdłuż linii

„wskaźnik ostrzegawczy z tablicy może być poza granicami”

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

Wygląda to zapewne to.

Ograniczeniem jest to, że masz przykład podobny do twojego powyżej. jak tylko masz zmienne zamiast literałów, nie jest to możliwe. może z wyjątkiem prostej pętli.

+0

[Według Wikipedii] (https://en.wikipedia.org/wiki/AddressSanitizer), ffmpeg wykorzystuje AddressSanitizer. Ten może być jego wyjściem Więcej na temat AddressSanitizer [w A na inny Q] (// stackoverflow.com/a/17637383/2157640). – Palec

3

Dla surowych tablic, nie sądzę więc, bo -fbounds-check nie działa ze swoim przykładem i MinGW g ++ 4.4.1, a ponieważ stary docs 3.x muszę powiedzieć

-fbounds -Check

na przednich końcach, które go obsługują, generować dodatkowy kod, aby sprawdzić, wskaźniki stosowane do tablic dojazdowych są w zadeklarowanym przedziale. Jest to obecnie obsługiwane tylko przez interfejsy Java i Fortran 77, gdzie ta opcja domyślnie jest równa true i false .

Jednak z std::vector można użyć at mieć nieco niepraktyczne run-time Granice obszaru kontroli (generuje wyjątek). Można również użyć specjalnej wersji biblioteki standardowej do debugowania, która zapewnia praktyczne sprawdzanie granic czasu wykonywania dla []. Na przykład podczas kompilacji & hellip;

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

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

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

& hellip; masz inny odpowiednio braku kontroli oraz zachowanie kontroli wersji dla uwalniania i debugowania w g ++ standardowej implementacji biblioteki:

 
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> _ 

Podobno na nowsze wersje g ++ (po 4,0), nie trzeba się _GLIBCXX_DEBUG_PEDANTIC symbol. Aby uzyskać szczegółowe informacje, patrz GNU documentation.

Cheers & HTH.,

+2

'{boost, std :: tr1, std} :: array' ma' at' także. –

Powiązane problemy