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

相关推荐
常利兵4 小时前
吃透Java操作符高阶:位操作符+赋值操作符全解析(Java&C区别+实战技巧+面试考点)
java·c语言·面试
口袋物联5 小时前
模板方法模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·模板方法模式
敲皮裤的代码5 小时前
《C语言》深入理解指针(3)
c语言
CUC-MenG7 小时前
Codeforces Round 1079 (Div. 2)A,B,C,D,E1,E2,F个人题解
c语言·开发语言·数学·算法
666HZ6667 小时前
数据结构4.0 串
c语言·数据结构·算法
程序员zgh8 小时前
Linux 内存管理单元 MMU
linux·运维·服务器·c语言·开发语言·c++
Mr YiRan9 小时前
指针实战运用进阶之字符串操作
c语言
Mr YiRan10 小时前
静态开辟内存与动态开辟内存
c语言
9359611 小时前
机考24 翻译18 单词11
c语言·数据结构·算法
民国二十三画生11 小时前
C++(兼容 C 语言) 的标准输入语法,用来读取一行文本
c语言·开发语言·c++