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

相关推荐
黎雁·泠崖32 分钟前
吃透指针通用用法:回调函数与 qsort 的使用和模拟
c语言·开发语言
脏脏a34 分钟前
聊聊 C 里的进制转换、移位操作与算术转换
c语言·开发语言·移位操作符
xie_pin_an35 分钟前
深入解析 C 语言排序算法:从快排优化到外排序实现
c语言·算法·排序算法
inputA1 小时前
【rt-thread】点灯实验和按键输入实验
c语言·笔记·学习·实时操作系统
EXtreme351 小时前
【数据结构】二叉树进阶:层序遍历不仅是按层打印,更是形态判定的利器!
c语言·数据结构·二叉树·bfs·广度优先搜索·算法思维·面试必考
子木鑫2 小时前
【练习】循环
c语言
shanks662 小时前
FFmpeg 入门指南:多媒体处理的瑞士军刀
c语言·ffmpeg
小龙报2 小时前
【算法通关指南:算法基础篇 】双指针专题:1.唯一的雪花 2.逛画展 3.字符串 4.丢手绢
c语言·数据结构·c++·人工智能·深度学习·算法·信息与通信
Fish41748 小时前
《C语言程序设计》琐碎知识点总结笔记
c语言·命令行参数·c语言程序设计·变量存储类型·函数存储类型·编译预处理
长安第一美人10 小时前
C 语言可变参数(...)实战:从 logger_print 到通用日志函数
c语言·开发语言·嵌入式硬件·日志·工业应用开发