导航:首页 > 源码编译 > 编译器检查栈溢出

编译器检查栈溢出

发布时间:2022-08-30 21:49:47

A. 什么是编译开关 pascal

在编译窗口中连按两下“ctrl+o”可以在程序头中出现所有编译开关情况,也可以自己书写。
下面是一些常见开关所代表的意思:
1)数据对齐(Align Data)
{$A+}或{$A-}
在{$A+}状态下,将非字符按偶地址对齐存放,可以提高8086和80286存取数据的速度。不影响字节变量、记录域结构和数组元素。在{$A-}状态下,将使用字节对齐方式,数据可存放在奇地址或偶地址。
2)布尔运算(Boolean Evaluation)
{$B+}或{$B-}
在{$B+}状态下,编译器产生完全布尔表达式运算代码。布尔表达式中的每个操作都确保被计算。既是整个表达式的结果以确定,还继续运算其余的表达式。
在{$B-}状态下,编译器产生短路布尔表达式运算代码。接着从左到右运算,当整个表达式结果确定后,就停止运算。

3)调试信息(Debug Information)
{$D+}或{$D-}
{$D+}产生调试信息,它在编译程序或单元产生运行错误时,能自动定位引起错误的语句。
4)浮点仿真(Emulation)
{$E+}或{$E-}
{$E+}只是在8087协处理器不存在时,将连接运行库以便对协处理器进行仿真。
{$N+,$E+}状态编译程序,系统将同8087仿真器连接,得到exe文件,不管有无8087,都可以在机器上进行IEEE标准754的二进制浮点运算。
{$N+,$E-}状态下,只能在有8087时,才能进行IEEE标准754的二进制浮点运算。
8087仿真开关如果用在一个单元是无效的,它只能用于程序的编译。

5)输入输出检查(Input/Output Checking)
{$I+}或{$I-}
$I指示控制是否自动产生对调用过程的结果进行检查。

6)数字处理(Numberic Processing)
{$N+}或{$N-}
{$N-}状态,在机器上只能进行实数类型运算。在{$N+}状态,在有8087协处理器或没有用{$E+}指示对8087进行仿真,都可以对IEEE浮点类型进行运算。
7)范围检查(Range Checking)
{$R+}或{$R-}
$R+进行边界和范围检查

8)栈溢出检查(Stack Overflow Checking)
{$S+}或{$S-}
在{$S+}状态下编译,程序在每个过程或函数的开始生成一段代码,用于检查是否有足够的栈空间供局部变量使用。若栈空间不够,程序停止运行,并显示运行错误。
在{$S+}状态下这样调用会导致系统崩溃。

9)变量串检查(Var String Checking)
{$V+}或{$V-}
在{$V+}状态下,实行严格的类型检查,要求形参、实参具有同一字符串类型。
在{$V+}状态下,允许任意类型的字符串变量作为实参,甚至是一实参的最大长度不同于形参长度。

BP7下的最佳参数是:
{$A+,B-,D-,E-,F-,G+,I-,L-,N+,O-,P+,Q-,R-,S-,T-,V-,X+,Y-}
{$M 65520,0,655360}
其中D和L与调试有关,调试时必须打开这两个参数
N+可以使程序能够使用扩展实型。一般情况下,Real速度最慢,不应该使用。
在编辑环境下按Ctrl+O+O,可以自动列出默认的编译指示,然后再自己改,这样比较快
要想知道各个参数的意义,可以察看BP7的联机帮助文档

B. 为什么在VIJOS上的AC程序在cena上测有两个点栈溢出

因为测评机不同咯,一个程序在vijos服务器上运行,一个在cena所在机器上运行。
栈溢出就是堆栈的空间不够用了,栈空间大小和机器、操作系统、编译器都可能有关。不过cena上测出栈溢出的话,应该还是程序本身占用太多栈空间了,只不过可能vijos上的机器比较强大或者限制比较宽让它过了而已。

C. C语言 linux编程 stack smashing detected问题,帮我看看这段代码哪栈溢出。。。。

while循环中的else中printf("%s",mail)有问题,recv(sockfd,message,250,0)接收到的字符串中不含有结束符号“\0”所以当你用printf去输出mail字符串时找不到结束标记,所以会产生越界行为。你应该把if(size<250)中的mail[Size]=0放到Size=recv(sockfd,mail,250,0)的后面;这个问题应该就可以解决了。还有请记住不要用编译器自带的默认初始化值,那个不可靠。

D. 编程中栈溢出的问题

这个。。。VC不让,说明VC有这个保护;C++对这个因该没有限制的,这个只是VC这个编译器认为你机器可能没这么牛B。
gcc就不管的,呵呵,但太大会运行时出错。

E. 堆溢出是error还是exception

堆内存溢出: OutOfMemoryError,是ERROR。

一、什么是Error:

Error用于指示应用程序不应该试图捕获的严重问题。

二、什么是Exception:

Exception类及其子类用于指示应用程序需要处理的异常。

三、Error与Exception之间的联系:

1.继承联系:

Error与Exception都继承java.lang.Throwable(所有错误或异常的超类)。

2.检查异常:

未检查异常: Error与RuntimeException及其子类称为未检查异常(未显示提醒的异常),java编译器未检查的代码块,当程序运行时可能出现的异常,在没有try和catch,也没有throws的情况下,仍然可以编译通过。

如:OutOfMemoryError(内存溢出异常),StackOverflowError(堆栈溢出时,抛出该错误),(数组超出排序索引范围时抛出)等异常。

检查异常:

除了Error与RuntimeException及其子类其他都称为检查异常(提醒处理的异常),这类异常如果没有try和catch,也没有throws的情况下,编译是不能通过的。

如:TimeoutException(阻塞操作超时时,抛出该异常),IOException(当发生某种 I/O 异常时,抛出此异常)。

F. 堆栈溢出一般是由什么原因导致的

递归过程的局部变量过多、递归深度过大,是造成系统栈溢出的原因,特别是递归列循环时肯定会发生系统栈溢出。

递归堆栈溢出的解决方案是尾部递归优化。事实上,尾部递归和循环具有相同的效果,所以可以把循环看作是一个特殊的尾部递归函数。

尾部递归,当函数返回时调用自身,并且返回语句不能包含表达式。通过这种方式,编译器或解释器可以优化尾部递归,这样递归本身无论被调用多少次,都只占用一个堆栈帧,而不会出现堆栈溢出。

(6)编译器检查栈溢出扩展阅读:

针对堆栈溢出可能造成的计算机安全问题,通常有以下这些防范措施:

1、强制代码遵循正确的规则。

2、使操作系统无法执行缓冲区,从而防止攻击者植入攻击代码。但是,由于攻击者不必求助于嵌入代码,而且Linux使用可执行的堆栈属性来发出信号和在线重用GCC,这种方法仍然有一些弱点。

3、利用编译器的边界检查实现缓冲区保护。这种方法使缓冲区溢出不可能发生,完全消除了缓冲区溢出的威胁,但是代价很高,比如性能较低。

4、对程序指针完整性进行检查,该方法可以防止绝大多数的缓冲区溢出攻击。这意味着在程序使用指针之前检查指针的内容是否已更改。

G. 如何解决栈溢出

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。



(7)编译器检查栈溢出扩展阅读

针对堆栈溢出可能造成的计算机安全问题,通常有以下这些防范措施:

1、强制按照正确的规则写代码。

2、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。但由于攻击者并不一定要通过植入代码来实现攻击,同时linux在信号传递和GCC的在线重用都使用了可执行堆栈的属性,因此该方法依然有一定弱点。

3、利用编译器的边界检查来实现缓冲区的保护。该方法使得缓冲区溢出不可能出现,完全消除了缓冲区溢出的威胁,但代价较大,如性能速度变慢。

4、程序指针完整性检查,该方法能阻止绝大多数缓冲区溢出攻击。该方法就是说在程序使用指针之前,检查指针的内容是否发生了变化。

H. Pascal 栈溢出

一般不会,只要你的递归有结束。要是数组什么的开的不够,也可能会溢出。

I. 用microsoft visual studio 2008执行C语言出现栈溢出怎么解决

if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
} hanoi(n-1,two,one,three);

应该是这样的
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
大括号位置打错了,呵呵,要用心检查哦!

阅读全文

与编译器检查栈溢出相关的资料

热点内容
小米易语言登录源码 浏览:28
砖墙内加密钢筋 浏览:990
乡关何处pdf 浏览:84
小猪领赞小程序源码 浏览:336
python曲线如何原路返回 浏览:430
pdf快速看图破解版 浏览:294
怎么找一个软件里面的源码 浏览:774
python设定安装源 浏览:833
boss直聘程序员面试方式 浏览:486
cc服务器怎么处理 浏览:455
福万通app哪里查到期 浏览:344
苹果换手机如何还原app 浏览:560
云服务器测试技巧 浏览:546
网盘里面的文件如何解压 浏览:465
linux查看应用的端口 浏览:97
拉伸训练pdf 浏览:92
如何拨号到中央服务器 浏览:650
中国天才少年程序员 浏览:352
编程思想pdf 浏览:282
加密欧美航线 浏览:50