张银奎老师《软件瑕疵的最佳实践》学习笔记

上一篇 / 下一篇  2010-12-21 12:19:35 / 个人分类:相关技术

1、对于一些软件比如对安全性要求较高的金融软件,宁可让一个小bug将系统搞崩溃掉也不要绕过这个bug让系统继续运行,因为一旦出现类似帐不平的问题,损失将是巨大的,所以从软件测试的角度来讲,针对不同的业务,对bug等级及优先级的定位、对bug的处理方式都是不一样的;同理,对安全性要求较高的系统,调试版本可能会比release版本更可靠。
2、他山之石、可以攻玉
3、50%的hack通过缓冲区溢出等方式获取相关地址,然后把病毒注入
4、软件开发过程中为测试提供更多的接口将可以提升软件的可测试性,为自动化测试提供基础
5、测试人员可以与开发人员亦敌亦友
6、老马识途,越是有能力的人做出来的软件质量越高
7、转储:将内存中的错误信息以文本文件等的方式输出出来,生成错误报告,因为内存中的信息是容易挥发的
8、微软的遥感技术:将用户使用微软产品过程中遇到的问题自动生成错误报告自动发送到微软相关的服务器上,这个我们的软件也可以借鉴,不过自动诊断、定位并搜集发送错误报告需要启动另外一个进程
9、一般的Log文件处理时都会有隐含锁,可能会有等待等情况导致性能问题,所以加Log、诊断、跟踪等相关功能时需要考虑对于系统性能的影响
10、PDB文件中含有调试和项目的状态信息,所以从安全的角度讲一般都不要暴露给别人
11、DFX/DFD,desigh for debug/test/....
12、Grace fot fail
13、托管代码:microsoft的中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#) 2.托管代码编译为microsoft的平台专用语言。
14、Access violation at address <十六进制值> in module <应用程序名> Read of address <十六进制值>
Windows用户可能经常会看到类似于错误提示:“Error:Access violation at address 836556F8
(004096da). Read of address 836556F8(00401000)”
通常的原因如下:
(1)调用一个不存在的对象
大部分Access violation的合理原因是使用了没有被创建或者已经被释放的对象。为了防止
这种类型的Access violation的发生,请确保你访问的任何对象都首先被创建了。例如,当一个Table定
位在一个没有被创建的data module(从auto-crete窗口里移走了)里,你可能在窗体的OnCreate事件里
打开这个表。
在下面的代码里,在调用一个已经被删除了的对象(b:TBitmap)事件后,一个Access violation出现了

var b:TBitmap;
begin
b:=TBitmap.Create;
try
//对b对象进行一些操作
finally
b.free;
end;
...
//由于b已经被释放,一个Access violation错误将会出现
b.Canvas.TextOut(0,0,’这是一个 Access Violation’);
end;
(2)不存在的API参数
如果你试图给Win API函数传递一个不存在的参数将会出现一个Access violation错误。解决此类Access
violation错误的最好方法是查阅Win API帮助,看看这个API函数调用的参数信息以及参数类型。例如,
总是保证不给一个缓冲参数传递一个无效指针。
(3)让Delphi释放
当一个对象拥有另一个对象时,让它给你做删除工作。因为默认情况下,所有的窗体(自动创建的)都
属于Application对象。当一个应用程序结束时,它释放了Application对象,也就释放了所有窗体。例
如,如果你在程序开始时自动创建了两个窗体(Form1/Unit1和Form2/Unit2),下面的代码就会导致
Access violation错误的出现:
unit Unit1;
...
uses unit2;
...
procedure TForm1.Call_Form2
begin
Form2.ShowModal;
Form2.Free;
//Access violation错误将会出现
Form2.ShowModal;
end;
(4)杀死异常
永远不要破坏临时异常对象(E),处理一个异常会自动释放异常对象。如果你自己手动释放了异常对象
,程序会试图再次释放它,那么就会出现Access violation错误:
Zero:=0;
try
dummy:= 10 / Zero;
except
on E: EZeroDivide do
MessageDlg(’不能用0做除数!’,mtError, [mbOK], 0);
E.free. ////Access violation错误将会出现
end;
(5)检索一个空字符串
一个空字符串是没有任何数据的。就是说,检索一个空字符串相当于访问一个不存在的对象,这将导致
Access violation错误:
var s: string;
begin
s:=’’;
s[1]:=’a’;
//Access violation错误将会出现
end;
(6)直接引用指针
你必须间接引用指针,否则你会改变指针地址并可能会破坏其他存储单元 :
procedure TForm1.Button1Click(Sender: TObject);
var
p1 : pointer;
p2 : pointer;
begin
GetMem(p1, 128);
GetMem(p2, 128);
//下一行导致Access violation错误
Move(p1, p2, 128);
//下一行方法正确
Move(p1^, p2^, 128);
FreeMem(p1, 128);
FreeMem(p2, 128);

TAG:

 

评分:0

我来说两句

Open Toolbar