使用某些标志编译以下文件时,是否有可能让g ++显示错误?
#include <iostream>
using namespace std;
int main()
{
int arr[ 2 ];
cout << arr[ 4 ] << endl;
return 0;
}
我看到像gcc -Wall -O2 main.c
这样的东西只适用于C而不是C ++。
答案 0 :(得分:7)
不在编译时。您可以在运行时检查它。
答案 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
),它在运行时进行边界检查。
不幸的是,编译缓冲区溢出的时间检查是一个非常难以解决的问题。它通常由完整的静态分析工具处理。