此为何错误?(50分)

  • 主题发起人 主题发起人 eversun
  • 开始时间 开始时间
E

eversun

Unregistered / Unconfirmed
GUEST, unregistred user!
我的Delphi程序偶而会出现以下的错误提示:
Access violation at address 00000038. Read of address FFFFFFFF.
但点OK后系统还能正常运行,请问何故?怎么解决?
 
多半是你得对象释放了两次,比如
Table1.Free;
在其他地方又
Table1.Free;

你将程序中所有得对象释放(用Free,少用Destroy)后马上付值nil;
 
agree with 沈前卫
还有可能是某指针被直接赋值到一不能访问的地址
 
可能是系统不稳定吧,可能是堆栈出了问题,过程返回(ret指令)取到不对的地址
返回到00000038(注意一个进程的地址空间里面不会访问这么小的地址,只有38h!)

也可能是你访问过程传递过来的参数时不够小心,过了界
更可能是访问本过程的本地变量(local variable)过了界
举个例子说明:
var
str:array[0..10] of char
然后你可能用 lstrcpy 写入str变量一个长于10个字符的字符串,
这样就会把东西写入本过程的返回地址上(在堆栈里),返回地址不对,当然
就会执行到乱七八糟的地方

要说明的是这种问题编译是通过的,执行该行程序也成功的,只是当过程返回时才出错
 
在堆栈里面排列是

高地址
传递进来的参数
返回地址
过程的本地变量
低地址

所以当写过程的本地变量过界就会破坏返回地址。
一个黑客的 overflow 攻击方法就类似如此,
发一个超长字符串,如果服务器程序没有判断长度就直接copy到本地变量,
本地变量空间不够,就会出错
 
多人接受答案了。
 
后退
顶部