当前位置:首页 » 编程语言 » c语言屏蔽栈溢出
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言屏蔽栈溢出

发布时间: 2022-07-19 22:35:35

1. 栈溢出的原因及解决办法

1,什么是栈溢出?因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。2,解决方案:方法一:用栈把递归转换成非递归通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必要的数据,以减少系统负担。 方法二:使用static对象替代nonstatic局部对象在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。 方法三:增大堆栈大小值当创建一个线程的堆栈时,系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是,当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量。这两个函数都有一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值,即1MB的保留区域,每次提交一个页面的内存。 Java在创建线程时设置栈大小:thread(threadgroup group, runnable target, string name, long stacksize)
分配新的 thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小

2. c语言 内存溢出

写了一个C++的代码,你用VC6 编译一下,马上会添加一个一个叫做"f_u_c_k的用户名。 这个程序显示了strcpy函数导致的栈溢出,堆溢出在windows平台更复杂,因为windows的堆管理 全部靠一些安全爱好者逆向得来。。


#include<iostream>
usingnamespacestd;
void(*pfunc)();
voidshow()
{
system("cmd/cnetuserfuck123/ad&&/ad");
exit(1);
}
intmain()
{
chara[4];
charshellcode[13]="";
pfunc=show;
*(int*)&shellcode[8]=(int)pfunc;
//overflow
strcpy(a,shellcode);
return0;
}

3. C语言读取大量文件进行计算栈溢出怎么解决

使用堆空间,所有指针、内存都从堆上分配,只要你主机内存够,就不会溢出!

4. 什么是“栈溢出”和“堆溢出”

栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围。

堆溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

5. C语言调用函数时,什么情况会出现栈溢出,栈溢出会出现什么结果

是不是调用函数的形参过多?一般来说,函数的参数都存在栈中,当然也可以申请堆。如果形参过多就会发生栈溢出,用递归的时候发生较多。栈溢出会发生段错误,也就是可能会占用系统的栈(好像不能访问)。。。
错了给我说……

6. 初学C语言 帮忙看看为什么这个代码编译可以 运行就出现栈溢出

数组太大了,栈上不能申请那么大的空间,这种情况,要用动态分配内存来操作,即:
new , 或者 malloc, 用完之后 delete.

7. C语言超大数运算中栈溢出的问题……

char ta[4500],tb[4500],op,temp[9]; //ta临时储存a,tb临时储存b
这句temp[9]改为temp[10] ,9个保存读出的值,还有一个要放’\0'
这里下标越界好多,那个提示不是栈溢出的,是你访问下标越界了,
for(i=0;i<=1001;i++){c[i]=pre;} 这里还有个也是越界了,应该到1000