1 背景
最近在用C++重构原来用C写的SDK,发现一个内存越界问题,记录下来,以供后续参考。
2 问题
代码如下:
c
#include <stdio.h>
#include <stdlib.h>
int array1[4] = {1, 2, 3, 4};
int array2[4] = {5, 6, 7, 8};
int main(int argc, char *argv[])
{
int count = 4;
int i;
if(argc > 1)
count = strtol(argv[1], 0, 0);
for(i = 0; i < count; i++)
printf("%d %d\n", i, array1[i]);
return 0;
}
-
运行1
$ ./mem 8
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
程序照常结束没有报错。
-
运行2
$ ./mem 16
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
程序照常结束没有报错。
-
运行3
$ ./mem 1024
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
.
.
.
1003 0
1004 0
1005 0
1006 0
1007 0
1008 0
1009 0
1010 0
1011 0
1012 0
1013 0
1014 0
1015 0
1016 0
1017 0
1018 0
1019 0
Segmentation fault (core dumped)
程序出现段错误,异常退出了。
3 分析
内存越界访问,如果越界不多,程序照常运行,很难发现。只有越界访问超出数据所在段,出现段错误才容易发现。这也是我们的SDK内存越界运行很长时间也不出错的原因。