有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组

部分原创

 

66下一步

Vs 堆栈 理论修改的上限是多少

问题2: 全局变量去 最大的上限是多少?

堆栈(休养版本测试)

2012年3月31日17:31:27 3月

 

 

clip_image001

 

clip_image002

 

clip_image003

10^5 10^6数组,导致vs…

当前:搭好脚手架。

 

改进: 修改vs系数。(byte 为单位i

改进二: 细化 时间粒度。

 

 

以上是我在项目汇总的修改。下面是阅读笔记

 

 

 

 

 

test dword ptr [eax],eax ; probe page.

2010年05月18日 星期二 20:19

局部数组变量定义超过所分配的最大空间

-----------------------------------

Posts Tagged 变量

局部数组变量定义所分配的最大空间为多少?如何设置大小

有两个程序

A:

  1. #include "stdafx.h"
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. int nArray[256000] = {0};
  5. nArray[1] = 5;
  6. printf("array 1 is %d",nArray[1]);
  7. return 0;
  8. }

B:

  1. #include "stdafx.h"
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. int nArray[260000] = {0};

    //66 大于 1m

  5. nArray[1] = 5;
  6. printf("array 1 is %d",nArray[1]);
  7. return 0;
  8. }

 

大家通过运行可以发现,A是可以正常运行的,B虽然编译通过了,可是当运行时就会弹出错误

错误的原因,就是栈溢出

 

局部变量的申请空间是存放于栈中,windows里默认栈内存是1M

所以当申请空间大于1M时就会出现溢出错误

通过debug就会进入以下文件chkask.asm

page ,132

title chkstk – C stack checking routine

;***

;chkstk.asm – C stack checking routine

;

; Copyright (c) Microsoft Corporation. All rights reserved.

;

;Purpose:

; Provides support for automatic stack checking in C procedures

; when stack checking is enabled.

;

;*******************************************************************************

.xlist

include cruntime.inc

.list

; size of a page of memory

_PAGESIZE_ equ 1000h

CODESEG

page

;***

;_chkstk – check stack upon procedure entry

;

;Purpose:

; Provide stack checking on procedure entry. Method is to simply probe

; each page of memory required for the stack in descending order. This

; causes the necessary pages of memory to be allocated via the guard

; page scheme, if possible. In the event of failure, the OS raises the

; _XCPT_UNABLE_TO_GROW_STACK exception.

;

; NOTE: Currently, the (EAX < _PAGESIZE_) code path falls through

; to the "lastpage" label of the (EAX >= _PAGESIZE_) code path. This

; is small; a minor speed optimization would be to special case

; this up top. This would avoid the painful save/restore of

; ecx and would shorten the code path by 4-6 instructions.

;

;Entry:

; EAX = size of local frame

;

;Exit:

; ESP = new stackframe, if successful

;

;Uses:

; EAX

;

;Exceptions:

; _XCPT_GUARD_PAGE_VIOLATION – May be raised on a page probe. NEVER TRAP

; THIS!!!! It is used by the OS to grow the

; stack on demand.

; _XCPT_UNABLE_TO_GROW_STACK – The stack cannot be grown. More precisely,

; the attempt by the OS memory manager to

; allocate another guard page in response

; to a _XCPT_GUARD_PAGE_VIOLATION has

; failed.

;

;*******************************************************************************

public _alloca_probe

_chkstk proc

_alloca_probe = _chkstk

push ecx

; Calculate new TOS.

lea ecx, [esp] + 8 – 4 ; TOS before entering function + size for ret value

sub ecx, eax ; new TOS

; Handle allocation size that results in wraparound.

; Wraparound will result in StackOverflow exception.

sbb eax, eax ; 0 if CF==0, ~0 if CF==1

not eax ; ~0 if TOS did not wrapped around, 0 otherwise

and ecx, eax ; set to 0 if wraparound

mov eax, esp ; current TOS

and eax, not ( _PAGESIZE_ – 1) ; Round down to current page boundary

cs10:

cmp ecx, eax ; Is new TOS

jb short cs20 ; in probed page?

mov eax, ecx ; yes.

pop ecx

xchg esp, eax ; update esp

mov eax, dword ptr [eax] ; get return address

mov dword ptr [esp], eax ; and put it at new TOS

ret

; Find next lower page and probe

cs20:

sub eax, _PAGESIZE_ ; decrease by PAGESIZE

test dword ptr [eax],eax ; probe page.

 

jmp short cs10

_chkstk endp

end

 

提示栈溢出

所以解决此问题的方法就是扩大栈空间的大小

方法为

项目->属性->链接器->系统->堆栈保留大小

注:这里填的是字节数

如果你想把他扩大为2M的话,

1024*1024*2 = 2097152

然后再编译运行的话A,B就都可以通过了

 

源文档 <http://hi.baidu.com/linzch/blog/item/e5107ff0a6cf6ccf7831aa02.html>

 

转载于:https://www.cnblogs.com/titer1/archive/2012/03/31/2427422.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

烧脑又过瘾!这个被严重低估的学习方法,看完瑟瑟发抖!

▲ 点击查看科学家曾在基于脑科学和认知科学后得出一个“学习的金字塔”理论。就是下面这张图&#xff1a;最顶端的就是我们所谓的“知识”&#xff0c;但为了可以达到这个顶端&#xff0c;下面有一系列的支撑能力。而引申出来的核心概念&#xff0c;就叫“玩中学”。不要想当然…

java中统计括号配对_括号配对问题(C语言或JAVA语言代码)

描述现在&#xff0c;有一行括号序列&#xff0c;请你检查这行括号是否配对。输入第一行输入一个数N(0"]", "(", ")" 四种字符输出每组输入数据的输出占一行&#xff0c;如果该字符串中所含的括号是配对的&#xff0c;则输出Yes,如果不配对则输出…

arguments.callee()事例 参数检验

<script>var abcfunction(x){if(x<2) return 1;else return x*arguments.callee(x-1);}var yabc(5);alert(y); </script>参数检验 <script>function check(args){var actualargs.length; //实际的参数长度var expectedargs.callee.length; …

Docker基础操作命令与常用容器创建

常用操作命令 docker search docker pull docker save docker load docker rm/rmi docker ps docker images docker create --name 容器 ... docker container ls docker stop/start/pause/unpause 容器名 docker exec -it 容器名 运行命令&#xff08;如&#xff1a;bash,red…

java号段_JAVA手机号正则(多号段)

import java.util.regex.Pattern;/*** author: Lindsay* Date: 2018/9/19 16:23* Description: 手机号正则*/public class PhoneRegUtils {/*** 是否是合法的手机号** param phone* return*/public static boolean isLegalPhoneNumber(String phone) {/*** 中国电信&#xff1a…

hdu 1863(最小生成树kruskal)

/*Name: hdu1863畅通工程 Author: Try86Date: 10/04/12 12:43Description: 最小生成树(kruskal) */ #include <cstdio> #include <iostream>using namespace std;const int M 5050;int p[M], sum; //sum统计顶点个数 struct edge {int a;int b;int w; }e[M];int…

java第二版课后题答案_Java语言程序设计第2版第16章 课后习题答案

《Java语言程序设计第2版第16章 课后习题答案》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《Java语言程序设计第2版第16章 课后习题答案(62页珍藏版)》请在人人文库网上搜索。1、第1章 Java语言概述选择题1-1 在下列概念中&#xff0c;Java语言只保留了(B)A. 运算符…

为什么手机最后 10% 的电量很不耐,最后1%的电量最耐用?

全世界只有3.14 % 的人关注了爆炸吧知识手机电量这玩意一直都是个玄学问题。为什么我的小手机&#xff0c;最后 1% 的电量最耐用&#xff0c;每次都够我看完一个十分钟的视频。又或者是为什么我的小手机&#xff0c;最后 10% 的电量很不耐用。。。每次电池报警还有 10% 的电量&…

HP 1020

HP 1020 先卸三颗螺丝 两根铁销 把盖子拔出 弹簧拔出 把硒鼓一分为二&#xff0c;有感光器的为废粉&#xff0c;倒出来&#xff0c;搽干净感光器 另外一个倒入干净的粉&#xff0c;小心不要把齿轮那面拆开了 倒好粉&#xff0c;合起来 合起来要先扣上弹簧&#xff0c;再按上盖…

使用identity+jwt保护你的webapi(三)——refresh token

前言上一篇已经介绍了identity的注册&#xff0c;登录&#xff0c;获取jwt token&#xff0c;本篇来完成refresh token。开始开始之前先说明一下为什么需要refresh token。虽然jwt token有很多优点&#xff0c;但是它的缺点也是非常明显。由于jwt无状态的特性&#xff0c;所以j…

窗体的关闭事件

对于关注对 Windows 窗体应用程序中引发的每个事件按次序进行处理的开发人员来说&#xff0c;事件引发的顺序特别重要。 当 Windows 窗体应用程序启动时&#xff0c;主窗体的启动事件按以下顺序引发 1、System.Windows.Forms.Control.HandleCreated    在为控件创建句柄时发生…

python多线程 不在main_从python线程(不是main)启动pyQt线程有什么不...

我有一个想要向其添加基本状态窗口的python控制台脚本,因此在不了解pyqt的情况下,我添加了一个窗口.如果我从主线程启动pyqt,它将阻塞其他所有内容,因此我从另一个线程启动了它.这样的运行情况已经好几个月了,但我只是注意到了一个警告(不确定我以前怎么错过它)&#xff1a;警告…

java设置窗口不可移动_Java – JDialog不可移动

什么代码有助于使JDialog无法移动&#xff1f;我看了两个选项&#xff1a;> setUndecorated(true);哪个有效,但删除了所有的装饰.> addComponentListener并覆盖componentMoved()方法,这会导致JDialog随后在移动时调用induEpilepticSeizure().有任何想法吗&#xff1f;解决…

一个10*10的正方形里,最多可以放多少个直径为1的圆?为啥不是100个?

祝大家元宵节快乐知识君曾经给大家出了一道题。↓Q&#xff1a;在一个10*10的正方形里&#xff0c;最多可以放多少个直径为1的圆&#xff1f;为啥不是100个&#xff1f;关于这道题&#xff0c;后台就收到了许多留言&#xff0c;大家纷纷给出了不同的答案。五花八门的答案&#…

.NET 时间格式 ----------摘自MSDN

使用在 DateTimeFormatInfo 的属性中存储的标准或自定义模式设置 DateTime 值的格式。 可以通过设置可写 DateTimeFormatInfo 的关联属性用自定义模式替代标准模式。若要确定 DateTimeFormatInfo 是否是可写的&#xff0c;请使用 IsReadOnly 属性。 下表列出了每一种标准模式的…

小甲鱼零基础入门python二十一课课后题_小甲鱼Python第二十一讲课后习题

测试题&#xff1a;0. 递归在编程上的形式是如何表现的呢&#xff1f;在编程上&#xff0c;递归表现为函数调用本身这么一个行为。1. 递归必须满足哪两个基本条件&#xff1f;一、 函数调用自身二、 设置了正确的返回条件2. 思考一下&#xff0c;按照递归的特…

MVC捕获数据保存时的具体字段验证错误代码

捕获验证错误代码 //try //{ // // 调试写数据库 //} //catch (DbEntityValidationException dbEx) //{ //}转载于:https://www.cnblogs.com/caojinqin/p/4561000.html

windows常用网络命令

1. ipconfig命令 ipconfig命令用于显示本机当前的TCP/IP配置的设置值&#xff0c;包括本机当前的IP地址、子网掩码、默认网关以及DNS服务器。可以用来检验TCP/IP配置是否正确。对于使用了动态主机配置协议&#xff08;DHCP&#xff09;的局域网&#xff0c;这个命令的作用就更加…

java中有stdin_在java中听stdin的后台进程

我必须创建一个java程序,当用户输入0时它应该退出.用java代码编写没问题.int cmd read();System.out.println("got command : " cmd);if (cmd 48) { // ASCII code for 0System.exit(0);我想在linux中使用start-stop脚本运行这个过程.我也可以使用&或者没有ca…

【开源框架】:解决方案级别的代码生成器 WebFirst

框架描述WebFirst 是一新代的 代码生成器&#xff0c;用法简单&#xff0c;功能强大&#xff0c;支持多种数据库 &#xff0c;具体功能如下&#xff1a;一、 建库、CodeFirst方式在线建表&#xff0c;没用到CodeFirst的用户可以用工具轻松体验&#xff0c;支持公共字段二、导出…