Можно ли включить проверку границ массива в g++?
Возможно ли, чтобы g++ отображала ошибку при компиляции следующего файла с некоторым флагом?
#include <iostream>
using namespace std;
int main()
{
int arr[ 2 ];
cout << arr[ 4 ] << endl;
return 0;
}
Я видел такие вещи, как gcc -Wall -O2 main.c
, который работает только с C, а не с С++.
Ответы
Ответ 1
Вы можете использовать статический анализатор, например Cppcheck. Когда вы запускаете свой код:
$ 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
Вы можете интегрировать Cppcheck в свою процедуру сборки и считаете, что ваш код успешно создан только в том случае, если Cppcheck проходит.
Ответ 2
Не во время компиляции. Возможно, вы сможете проверить это во время выполнения.
Для этого взгляните на:
Проверка границ массива Runtime с помощью g++
Ответ 3
Для необработанных массивов я так не думаю, потому что -fbounds-check
не работал с вашим примером и MingW g++ 4.4.1, а поскольку старые документы 3.x я сказал
-fbounds-check
Для интерфейсов, которые его поддерживают, генерировать дополнительный код, чтобы проверить, что индексы, используемые для доступа к массивам, в пределах объявленного диапазона. Это в настоящее время поддерживается только Java и Fortran 77, где это по умолчанию используется значение true и false соответственно.
Однако с std::vector
вы можете использовать at
, чтобы иметь немного непрактичную проверку границ времени выполнения (генерирует исключение). И вы можете использовать специальную отладочную версию стандартной библиотеки, которая обеспечивает практические проверки времени выполнения для []
. Например, при компиляции & hellip;
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> arr( 2 );
cout << arr[ 4 ] << endl;
}
& hellip; вы получаете разные, соответственно не проверяющие и проверяющие поведение версий выпуска и отладки реализации стандартной библиотеки g++:
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 support team for more information.
C:\test> _
Сообщается, что для новых версий g++ (после 4.0) вам не нужен символ _GLIBCXX_DEBUG_PEDANTIC
. Подробнее см. В документации GNU.
Приветствия и hth.,
Ответ 4
Я помню, что видел предупреждение gcc или g++ из ffmpeg или x264 в строках
"предупреждающий индекс массива может быть вне границ"
http://gcc.gnu.org/ml/gcc/2000-07/msg01000.html
похоже, что он, вероятно, сделал это.
Ограничение состоит в том, что у вас есть пример, подобный вашему выше. как только у вас есть переменные вместо литералов, это невозможно. за исключением, возможно, простого цикла.
Ответ 5
Вы можете заменить массивы std::vector
. Вектор имеет функцию-член-член (std::vector::at
), которая проверяет границы во время выполнения.
Проверка времени компиляции для переполнения буфера - это очень трудная неразрешимая проблема, к сожалению. Он обычно обрабатывается полномасштабным инструментом статического анализа.