记一次C语言内存越界(内存越界 段错误 Segmentation fault )

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内存越界运行很长时间也不出错的原因。

相关推荐
森焱森2 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
small_wh1te_coder6 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
黑听人10 小时前
【力扣 简单 C】70. 爬楼梯
c语言·leetcode
杜子不疼.10 小时前
二分查找,乘法口诀表,判断闰年,判断素数,使用函数实现数组操作
c语言
呜喵王阿尔萨斯15 小时前
编程中的英语
c语言·c++
only-lucky16 小时前
C语言socket编程-补充
服务器·c语言·php
JeffersonZU17 小时前
Linux/Unix进程概念及基本操作(PID、内存布局、虚拟内存、环境变量、fork、exit、wait、exec、system)
linux·c语言·unix·gnu
ruanjiananquan9918 小时前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
持梦远方19 小时前
C 语言基础入门:基本数据类型与运算符详解
c语言·开发语言·c++