是否可以在g ++中启用数组边界检查?

时间:2011-01-24 04:09:10

标签: g++ c++

使用某些标志编译以下文件时,是否有可能让g ++显示错误?

#include <iostream>
using namespace std;

int main()
{
   int arr[ 2 ];

   cout << arr[ 4 ] << endl;

   return 0;
}

我看到像gcc -Wall -O2 main.c这样的东西只适用于C而不是C ++。

5 个答案:

答案 0 :(得分:7)

不在编译时。您可以在运行时检查它。

为此,请看一下: Runtime array bounds checking with g++

答案 1 :(得分:3)

对于原始数组,我不这么认为,因为-fbounds-check不适用于您的示例和MingW g ++ 4.4.1,并且因为旧的3.x文档我说过

  

-fbounds-check

     

对于支持它的前端,   生成额外的代码来检查   用于访问数组的索引是   在声明的范围内。这是   目前只支持Java   和Fortran 77的前端,这个   选项默认为true和false   分别

但是,对于std::vector,您可以使用at进行稍微不切实际的运行时边界检查(生成异常)。您可以使用标准库的特殊调试版本,它为[]提供实用的运行时边界检查。例如,编译时......

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

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

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

...对于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's support team for more information.

C:\test> _

据报道,对于较新的g ++版本(4.0之后),您不需要_GLIBCXX_DEBUG_PEDANTIC符号。有关详细信息,请参阅GNU documentation

干杯&amp;第h。,

答案 2 :(得分:3)

您可以使用静态分析器,例如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 :(得分:2)

我记得看到来自ffmpeg或x264的gcc或g ++警告消息

“数组的警告索引可能超出范围”

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

似乎可能就是它。

约束条件是你有一个像你的例子。只要你有变量而不是文字,就不可能。除了可能是一个简单的循环。

答案 4 :(得分:0)

您可以使用std::vector替换数组。 Vector具有访问器成员函数(std::vector::at),它在运行时进行边界检查。

不幸的是,编译缓冲区溢出的时间检查是一个非常难以解决的问题。它通常由完整的静态分析工具处理。