栈溢出

你真的了解栈溢出么? 记得之前看过一篇文章说,最好查的bug是语法错误,因为编译器会告诉你,最不好查的bug是栈溢出,因为啥,因为不仅编译器不会告诉你,连你自己有可能都找不到原因出在哪。 经过了一段时间的摸索,算是基本搞清楚了栈溢出的原理,写下来以防日后出现问题无从下手。 前言 开发过单片机的同学应该不陌生这个名词,一般我们也说堆栈,其实这里有两个意思:一般我们说堆栈其实指的就是帧本身,而说堆指的就是堆。这是两个 阅读详情

栈溢出

 

做一个手机项目,在手机上运行死机,trace出来报错 “栈溢出”,首先修改了函数中较大的数组,超过128的基本上都去掉了,还是挂机, 找了半天,感觉无处下手, 最后测试出一种情况,不挂机,就是 不加载所有的图片,正常了,最后的解决办法是:在一开始进入程序时,不加载所有的图片 ,等程序初始化好了,再开始加载图片,不挂机了 。

 

 

下面是转载别人的一篇文章

 

最近在做一个程序(VC6.0),功能大概有网络通信、数据库、绘图等。测试的时候程序一运行到某个函数就出现此错误,查了很多地方,试了很多解决办法,终于把问题解决了,写个日志提醒一下自己,也希望作为一个普遍解决办法让大家少费工夫(其他编译器也会出现同样的问题)。
    大家都知道,Windows程序的内存机制大概是这样的,全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出;函数地址、函数参数、局部变量等信息存储于栈内存,VC6中栈内存默认大小为1M,对于当前日益扩大的程序规模而言,稍有不慎就可能出问题。
(动态申请的内存即new出来的内存不在栈中)
    即如果函数这样写:
    void test_stack_overflow()
    {
       char* chdata = new[2*1024*1024];
       delete []chdata;
    }
    是不会出现这个错误的,而这样写则不行:
    void test_stack_overflow()
    {
       char chdata[2*1024*1024];
    }
    大多数情况下都会出现内存溢出的错误,不信在vc6中随便做个程序,调用一下这个函数试式。


    出现栈内存溢出的常见原因有2个:
    1> 函数调用层次过深,每调用一次,函数的参数、局部变量等信息就压一次栈。
    2> 局部静态变量体积太大
    第一种情况不太常见,因为很多情况下我们都用其他方法来代替递归调用(反正我是这么做的),所以只要不出现无限制的调用都应该是没有问题的,起码深度几十层我想是没问题的,这个我没试过但我想没有谁会把调用深度作那么多。检查是否是此原因的方法为,在引起溢出的那个函数处设一个断点,然后执行程序使其停在断点处, 然后按下快捷键Alt+7调出call stack窗口,在窗口中可以看到函数调用的层次关系。

    第二种情况比较常见了,我就是犯了这个错误,我在函数里定义了一个局部变量,是一个类对象,该类中有一个大数组,大概是1.5M。
    
    解决办法大致说来也有两种:
    1> 增加栈内存的数目
    2> 使用堆内存
    增加栈内存方法如下,在vc6种依次选择Project->Setting->Link,在Category中选择output,在Reserve中输入16进制的栈内存大小如:0x10000000,然后点ok就可以了。
  
    其他编译器也有类似的设置,个人认为这不是一个好办法,有一个致命原因,不知道有没有人遇到过,我把栈内存改大后,与数据库建立不了连接了(ADO方式,Acess数据库),把栈内存还原,问题立刻消失。不知道究竟是什么原因,有知道的可以告诉我。
     email: la_ariza@sina.com

     第二种解决办法是比较可行的,具体实现由很多种方法可以直接把数组定义改成指针,然后动态申请内存;也可以把局部变量变成全局变量,一个偷懒的办法是直接在定义前边加个static,呵呵,直接变成静态变量(实质就是全局变量)。即可以把上例中的函数这么写:

    void test_stack_overflow()
    {
       static char chdata[2*1024*1024];
    }


    当然,除非万不得已,尽量不要使用这么大的数组,出现这种情况多半说明程序结构有问题。

堆栈认知——栈溢出实例(ret2libc)_栈溢出举例 我们可在栈溢出的时候,再让其执行gets函数,给其输入一个“/bin/sh”就好啦,值得注意的是:我们输入的“/bin/sh”需要放到bss段中的一个地址上去,因为这个不会随着函数的栈被覆盖或回收等机制导致我们找不到“/bin/sh”的地址了。注意:在泄露的时候我们需要通过gets函数的got表地址加偏移来泄露got表中的system函数地址,具体含义可百度一下,这里不过过深的说明。到此时我们就到了gets函数的libc中的地址,那么接下来我们就要获取system函数在libc中的地址。 阅读详情

相关推荐

FreeRTOS——栈溢出保护

FreeRTOS——堆栈溢出保护堆栈使用堆栈溢出检测 - 方法 1 堆栈使用 每个任务都维护自己的堆栈。如果使用xTaskCreate()创建任务,则用作任务堆栈的内存会从 FreeRTOS 堆自动分配 ,并通过传递给 xTaskCreate() API 函数的参数来确定大小。如果使用xTaskCreateStatic()创建任务,则用作任务堆栈的内存由应用程序设计者预先分配。堆栈溢出是应用程序不稳定的一个非常常见的原因。因此,FreeRTOS 提供了两种可选机制,可用于协助检测和纠正此类事件。使用的选项由

weixin_44567318的博客 4225

StackOverflowError(栈溢出错误)可能的原因和解决方法

递归深度的优化、终止条件的添加以及递归到迭代的转换都是常见的处理手段。(栈溢出错误)通常表示方法调用的递归深度过大,导致函数调用栈溢出。如果递归调用的数据规模过大,每次调用都需要占用较大的栈空间,可能导致栈溢出。默认情况下,虚拟机栈的大小是有限的,如果调用栈深度过大,可能超过栈的容量。有时,即使递归调用的深度没有问题,但递归的设计不合理也可能导致栈溢出。如果递归调用没有明显的终止条件,可能导致无限循环,最终触发栈溢出。一个长的方法调用链,尤其是在循环中,也可能导致栈溢出。

Java开源程序猿 8505

极验第四代滑块验证码破解(三):滑块轨迹构造

极验第四代滑块验证码破解(三):滑块轨迹构造声明 声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接:

帯泪的鱼的博客 8624

栈溢出错误:原因与有效预防策略

栈溢出是编程中常见且危险的错误,可能导致程序崩溃或安全漏洞。本文系统分析了栈溢出的主要原因,包括递归过深、大局部变量、无限递归和未检查的缓冲区操作。针对这些问题,文章提出了7种实用预防策略:迭代替代递归、控制递归深度、避免栈上大对象、使用安全字符串函数、启用编译器保护、使用分析工具和调整栈大小。每种策略都配有代码示例和适用场景说明。文章强调预防胜于修复,建议从设计阶段就考虑栈空间限制,采用现代编程实践和安全特性,结合多层防护体系,有效避免栈溢出问题。

学习代码 889

自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证

本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。

weixin_28273593的博客 248

CATIA V5新手必看:从零开始的界面导航与基础操作指南(附常见问题解决)

本文为CATIA V5新手提供全面的界面导航与基础操作指南,涵盖核心工作区解析、文件管理规范、视图操作秘籍及常见问题解决方案。通过详细的步骤说明和实用技巧,帮助用户快速掌握这一工业设计标杆软件,特别适合从SolidWorks、AutoCAD等软件过渡的用户。

b9c0d的博客 527

栈溢出问题分析

‌。栈溢出通常会导致程序崩溃,并显示错误信息。具体提示信息可能会因操作系统和编程语言的不同而有所差异。

m0_44982254的博客 363

VFIO框架源码分析(二十二)- IOMMUFD 的脏页跟踪与 Dirty Bits 读取

在虚拟化热迁移(Live Migration)的场景中,脏页追踪(Dirty Page Tracking)是最具挑战性的环节之一。它的核心任务是实时捕获设备(DMA)对内存的写操作,以便 VMM(如 QEMU)知道哪些内存页需要被重新传输到目标主机。在强耦合与粗粒度:脏页追踪是绑定在 Container 上的。这意味着,如果一个 Container 内有多个设备,哪怕只有一个设备在写内存,脏页追踪也会影响 Container 内的所有设备。软件模拟开销大。

qq_36071928的博客 1042

python安卓脚本精灵使用教程_按键精灵安卓按键初体验—乱斗西游2自动签到

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot,Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想制作脚本和学习按键精灵的朋友可以添加按键精灵学习交流群:554127455 学习路上不再孤单,金猪脚本伴你一同成长.纵观现在的游戏市场,手机游戏现在占有的比重越来越高,在按...

weixin_39628041的博客 1553

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

Rockyoung 3321

栈溢出原理

栈溢出原理 文章目录栈溢出原理前言:栈一、栈溢出原理二、栈保护技术三、常发生栈溢出的危险函数四、可利用的栈溢出覆盖位置总结 前言:栈 栈是一种LIFO的数据结构。 应用程序有一到多个用户态栈。 栈自底向上增长,由指令PUSH和POP引起其动态变化。 局部变量布局在栈中。 调用函数时参数由栈传递,返回地址也存储于栈中。 函数调用上下文与局部变量共同组成了栈帧——Stack Frame. 栈帧 = 局部变量 + 函数调用上下文 栈帧实际上只是一个通俗的说法,关于栈帧的上下界历来有两种说法,一曰以EBP和E

qq_52126646的博客 8505

本地部署AI应用:基于Google Gemini的banana-prompt快速上手指南

AI应用开发的核心在于将大模型能力集成到实际场景中,其原理是通过API调用将用户输入转化为模型可理解的指令,再由模型生成响应。这一技术价值在于降低AI应用开发门槛,实现数据本地化处理与隐私保护。在工程实践中,开发者常面临环境配置复杂、API集成繁琐等挑战。本文聚焦于使用banana-prompt工具包,通过TypeScript技术栈和npm包管理,快速在Windows本地部署基于Google Gemini API的AI应用。该方案特别适用于ai-prompts提示词工程和content-creation内容

weixin_27188815的博客 314

栈溢出漏洞及栈溢出攻击

1. 栈溢出的原因 栈溢出(stack-based buffer overflows)算是安全界常见的漏洞。一方面因为程序员的疏忽,使用了 strcpy、sprintf 等不安全的函数,增加了栈溢出漏洞的可能。另一方面,因为栈上保存了函数的返回地址等信息,因此如果攻击者能任意覆盖栈上的数据,通常情况下就意味着他能修改程序的执行流程,从而造成更大的破坏。这种攻击方法就是栈溢出攻击(stack

guilanl的专栏 1万+

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1566

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

初识栈溢出及利用栈溢出的四种攻击方法

栈溢出 本质: 混淆了用户输入与栈上的元数据 产生原因: 用户输入的数据大小超过了程序预留的空间大小 利用: 覆盖返回地址 覆盖栈上的变量,例如函数指针或对象指针 基本栈溢出漏洞实例:实际演示 stack_shellcode 以python语言举例, 运行报错。 据我理解,在python中,函数调用一次,栈(stack)多加一层栈帧,由于栈帧的增加有上限,函数调用次数过多会导致栈溢出。(在c语...

Kni9hT's Blog 6351

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

请小心栈溢出

写这篇文章本意是帮助萌新们对栈溢出能够有一个较为直观的理解,可能废话有点多,让各位大佬见笑了,还望不喜勿喷。 阅读本文前,建议掌握一定汇编基础 接下来我们进入正题。 或许你在平常时有在老师、朋友、或是其他的程序员的口中听过“栈溢出”这个词,那到底什么是栈溢出呢?为什么栈会溢出呢? 我们先来看看百度百科的描述: 栈溢出就是缓冲区溢出的一种。由于缓冲区溢出而使得有用的存...

培纪的博客 4959

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

栈溢出的原因与分析

回答一个面试题:无限递归是否一定会溢出栈?

weixin_52648900的博客 1798

linux之栈溢出分析

这个过程展示了如何使用GDB来识别和修复栈溢出问题。调试时,重要的是要理解程序的递归深度,以确保递归函数有合适的退出条件,防止无限递归导致的栈溢出。我们来创建一个例子,其中包含一个段错误,这次是由于栈溢出导致的。这是一个常见的错误,通常发生在程序递归调用深度过大,超出了为栈分配的内存空间。: 在GDB调试器内部,你可以使用以下命令来分析程序崩溃的原因。命令你可以查看崩溃点附近的源码,这里应该会显示递归函数的代码。因为是栈溢出,你将可能看到非常深的函数调用堆栈,反复调用。下面是一个简单的C程序,

少说,多做。 4259

PWN入门之栈溢出

看了很多博客,自己总结下来就是以下几点:1.栈是用来存放局部变量的,例如函数的参数,返回地址,局部变量等,然后由系统自动分配释放2.在C语言中,将数据压入栈中用的是push,将数据弹出用的是pop3.先入栈的数据是在底部的,后入栈的数据在顶部,而去数据的时候又是从顶部开始的,总的来说 就是先进的后出,后进的先出4.递归调用用的是栈作为缓冲区。

cyy001128的博客 1563

栈溢出攻击

《目录》 栈的初始大小及修改 栈溢出攻击原理 判断栈的增长方向 栈溢出攻击实例 换算公式 栈,是一种数据结构(后进先出)。 程序的运行都需要用到栈,图中的 FP 是栈帧,通过栈帧的指引可以实现函...

Debroon 2744

c语言栈溢出的原因及解决办法_栈溢出基础

一. 基础知识什么是缓冲区溢出在深入探讨技术之前, 让我们先了解一下缓冲区溢出的实际内容.想象一个非常简单的程序, 要求你输入你的用户名, 然后返回到它在做什么.从视觉上看, 如下所示注意到括号之间的空格是输入用户名的预期空间.那个空间是我们的缓冲.处理用户名后, 返回地址将告知程序需要执行的下一个指令.现在, 如果我们不仅输入用户名, 而且添加其他数据以溢出此缓冲区空间, 会发生什么情况?不仅如...

weixin_39966053的博客 6269

栈溢出是什么?

栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。 栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,...

qq_45470829的博客 6331
上一篇: C++模板--------双向链表
下一篇: 日历算法
Timwolee
博客等级 码龄17年 16粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值