Можно ли включить проверку границ массива в 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 проходит.

Ответ 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), которая проверяет границы во время выполнения.

Проверка времени компиляции для переполнения буфера - это очень трудная неразрешимая проблема, к сожалению. Он обычно обрабатывается полномасштабным инструментом статического анализа.