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

相关推荐
捷瑞电子工坊5 小时前
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结
c语言·stm32·嵌入式工程师·rtos·通信协议·嵌入式面试
天空'之城6 小时前
C 语言工业级通用组件手写 30:安全内存拷贝组件
c语言·内存拷贝·工业级组件·安全内存操作
LuminousCPP7 小时前
数据结构-双向循环链表
c语言·数据结构·笔记·链表
小僧景贤10 小时前
嵌入式C语言 第二篇:基础语法|嵌入式C与标准C的核心差异
c语言·开发语言·嵌入式c语言
wuyk55512 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
LuminousCPP13 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
带鱼吃猫13 小时前
预处理器:宏、运算符与条件编译
c语言·开发语言
(Charon)14 小时前
【C++】线程安全队列(二):生产者消费者模型与 condition_variable 阻塞等待
c语言·开发语言·c++
SunnyByte14 小时前
排序进阶:快速排序与归并排序的迭代实现,并与递归版本对比
c语言·数据结构·算法·排序算法
wuminyu16 小时前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++