转载于https://www.csdn.net/tags/NtDaUgzsNjgyMzUtYmxvZwO0O0OO0O0O.html

文章目录

  1. 常见的程序崩溃示例
  2. 执行结果分析
  3. 常见的程序崩溃示例
    常见的崩溃类型有以下几种:

对空指针指向的内存非法写操作
对空指针指向的内存非法读操作
除0操作
大的临时变量或者递归等导致栈溢出
对只读内存进行写操作
堆越界写操作
对已经释放的内存进行写操作
代码示例:

//corruption.c
#include <stdlib.h>
#include <stdio.h>void make_corruption(int type)
{printf("case %d:\n", type);switch (type){case 0:{//对空指针指向的内存非法写操作char *str = NULL;str[0] = 0;break;}case 1:{//对空指针指向的内存非法读操作char *str = NULL;int i = str[0];printf("i=%d", i);break;}case 2:{//除0操作int i = 10;int j = 0;int ret = i / j;printf("ret=%d", ret);break;}case 3:{//大的临时变量导致栈溢出//char str[8 * 1024 * 1024] = {0}; //需要验证时再放开该行,否则栈越界必现死机导致其他case无法验证break;}case 4:{//对只读内存进行写操作char *str = "abc";str[0] = 10;break;}case 5:{//堆越界写操作int *a = (int *)malloc(sizeof(int) * 4);int *b = (int *)malloc(sizeof(int) * 4);printf("a:%p, b:%p\n", a, b);memset(a, 0, sizeof(int) * 8);free(a);free(b);break;}case 6:{//对已经释放的内存进行写操作。#if 0//没有死机char *str = (char *)malloc(SMALL_MEMORY);free(str);memset(str, 0, SMALL_MEMORY);#else//coredumpchar *str = (char *)malloc(LARGE_MEMORY);free(str);memset(str, 0, LARGE_MEMORY);#endifbreak;}default:{printf("to do.\n");}}return;
}int main()
{int type = 0;scanf("%d", &type);//制造程序崩溃make_corruption(type);return 0;
}
  1. 执行结果分析
    [root@localhost all_kinds_corrupt]# gcc -g corruption.c -o corrupt
    [root@localhost all_kinds_corrupt]# ./corrupt
    0
    case 0:
    Segmentation fault (core dumped)
    [root@localhost all_kinds_corrupt]# ./corrupt
    1
    case 1:
    Segmentation fault (core dumped)
    [root@localhost all_kinds_corrupt]# ./corrupt
    2
    case 2:
    Floating point exception (core dumped)
    [root@localhost all_kinds_corrupt]# ./corrupt
    4
    case 4:
    Segmentation fault (core dumped)
    [root@localhost all_kinds_corrupt]# ./corrupt
    5
    case 5:
    a:0x1ca9ac0, b:0x1ca9ae0
    free(): invalid pointer
    Segmentation fault (core dumped)
    [root@localhost all_kinds_corrupt]# ./corrupt
    6
    case 6:
    我们可以看到,case 6在两种不同内存大小情况下表现一同:
    (1)小内存情况下没有死机,这是因为Glibc会将该内存放到unsorted bin,此时内存没有进行合并或者重新分配出去,可以进行写操作。
    (2)对于大内存情况,Glibc会通过调用mmap(大于128K)从系统申请内存,在free之后会直接归还给操作系统,此时进行写操作是非法的。
    至于Glibc对于不同大小的内存管理,则需要另外一篇文章来进行详细讲解了。

我们把case 3的代码放开,重新编译执行:

[root@localhost all_kinds_corrupt]# ./corrupt
100
段错误 (核心已转储)
type=100时应该是走进default分支,但实际上程序产生了段错误,其原因就是栈溢出。我们可以通过ulimit -s查看栈的默认大小,通常为8M。

[root@localhost all_kinds_corrupt]# ulimit -s
8192

c语言运行程序崩溃(crash)的原因相关推荐

  1. 关于Windows程序崩溃(Crash)以及生成dump文件的探究

    文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...

  2. 用c语言运行程序的优点,C语言学习与总结---第一章:C语言概述

    第一章:C语言概述 1.绪论 2.计算机程序 3.计算机语言 4.C语言的发展及其特点 5.最简单的C语言程序 6.运行C语言程序的方法与步骤 7.程序设计任务 1.绪论 C语言是计算机基础语言,本次 ...

  3. Linux终端下后台运行程序被Stopped的原因以及解决

    一.问题以及原因 为设备写了一个测试WIFI连通性的C++小程序,登录设备后在终端运行程序,使其后台执行: ./AP_Connect & 终端打印此信息:[1]+  已停止           ...

  4. 物资管理系统c语言运行程序,C语言实现仓库物资管理系统.pdf

    C语语言言实实现现仓仓库库物物资资管管理理系系统统 前前言言 此系统为博主大一上学期C语言课程设计的大作业,由 当时初步接触C语言,现在来看程序写的太烂了,简直不忍直视--但是 还是想通过博客的形式记 ...

  5. mac c语言运行程序,Mac运行C语言

    首先可以用记事本或者开发工具啥的 写一段C 我这边用的是vscode   然后打开终端,输入gcc 如果你没有安装 Command Line Tools,会弹出一个窗口提示你安装,如图所示,点击安装即 ...

  6. 物资管理系统c语言运行程序,C语言-物资管理系统设计报告

    <C语言-物资管理系统设计报告>由会员分享,可在线阅读,更多相关<C语言-物资管理系统设计报告(59页珍藏版)>请在人人文库网上搜索. 1.C语言程序设计报告物资管理系统指导老 ...

  7. c语言运行程序没有,这个程序怎么运行?为什么显示没有exe??

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include #include void main() { void welc ...

  8. iOS程序闪退的原因以及处理办法

    iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...

  9. android 6.0 权限程序崩溃,扫二维码崩溃与按键事件

    1.权限 解决困扰我两天的问题,项目调用一些.so文件,demo,和老版本的在华为 6.0系统运行正常,但是我的项目在6.0以下的手机上运行正常,在6.0系统上程序直接崩溃,6.0系统自然想到了权限问 ...

最新文章

  1. URI URL 简介区别
  2. vs2010发布、打包安装程序(超全超详细)
  3. [网络安全自学篇] 三十四.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析
  4. 洛谷 - P2756 飞行员配对方案问题(二分图最大匹配+路径打印)
  5. 人工智能tensorflow图的可视化
  6. 笔记47-徐 数据库引擎中基于行版本控制的隔离级别
  7. 转:完全卸载Oracle方法
  8. How does RECORDLENGTH affect your exp speed?
  9. c语言 判断一个图是否全连通_【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2)...
  10. mx350显卡天梯图_分享电脑显卡天梯图2020
  11. 随机过程及其在金融领域中的应用 第二章 习题 及 答案
  12. Android ViewModel与LiveData组件组合使用详解
  13. Stable Diffusion采样速度翻倍!仅需10到25步的扩散模型采样算法
  14. lua 随机数 math.random()和math.randomseed()用法
  15. 使用动态规划算法需要满足的必要条件:优化原则
  16. Spamhaus -影响最大的RBL(实时黑名单列表)服务提供商,非营利性组织
  17. C++ placement new 用法
  18. 物理思维在计算机中的应用,思维导图学物理 学会用大脑的语言进行思考
  19. 位移运算(左移,右移)
  20. 交换机千兆和百兆对网速影响_交换机千兆和百兆对网速影响_千兆/百兆/核心/PoE/光纤交换机选型指南...

热门文章

  1. BGP实验,MPLS多协议标签交换防路由黑洞
  2. 国外问卷调查该怎么做?
  3. 搭建深度学习网络识别图片--猫狗大战
  4. java程序调试步骤
  5. LINUX 文件系统和挂载点间的区别与联系
  6. Unity3D引擎之高级渲染技术
  7. 目标检测中背景建模方法 [转]
  8. 【无人机】【2018.09】无人机航迹优化问题
  9. 二分查找 (二分搜索) 最通俗易懂的图解与实现
  10. 论文阅读笔记:为什么深度神经网络的训练无论多少次迭代永远有效?可能类内分布已经坍缩为一个点,模型已经崩溃为线性分类器