高分求教,关于编译选项中的Range checking和Overflow checking是否应勾选 (200分)

  • 主题发起人 主题发起人 叮叮当当
  • 开始时间 开始时间

叮叮当当

Unregistered / Unconfirmed
GUEST, unregistred user!
[blue]Range checking和Overflow checking勾选后会导致很多麻烦:[/blue]
例1:进行累计和校验的子程序:
procdure ComputeSUMCheck(const Frame: array of Byte; var SUM: Byte);
var
i: Integer;
begin
SUM := 0;
for i:=Low(Frame) to High(Frame) do
Inc(SUM, Frame); // SUM增加到超过255时,会导致运行时错误
end;

例2:RootNodeCount: Cardinal;(某控件的一个属性)
var
i: Integer;
begin
// 假设此时 RootNodeCount = 0
for i:=0 to RootNodeCount-1 do // 同样会导致运行时错误
begin
...

由于 Delphi 在编译时并不检查这种运行时可能发生的溢出错误,导致很多地方都有溢出错误隐患,而实际上如果去除编译检查,这些子程序运行并不会有任何问题。Delphi并不会把超出变量范围的那部分数据填充到不该填充的内存区域而导致非法操作。

[blue]Range checking和Overflow checking不勾选的话心里总觉得不安全,软件到了用户手里万一哪里出错要找错就头疼了。[/blue]

分析题:
请谈谈如何正确对待Range checking和Overflow checking?:)
 
忘了说,上面两例的解决办法当然是有的:
例1:
procdure ComputeSUMCheck(const Frame: array of Byte; var SUM: Byte);
var
i: Integer;
begin
SUM := 0;
for i:=Low(Frame) to High(Frame) do
SUM := (SUM + Frame) mod 256;
end;

例2:
var
i: Integer;
begin
// 假设此时 RootNodeCount = 0
for i:=0 to Integer(RootNodeCount)-1 do
begin
...
 
的确有时候产生溢出时不会有任何影响,像用加法交换两个整型变量的值,
a:=a+b;
b:=a-b;
a:=a-b;
如果有溢出,但结果却不影响。
 
这个只有自己写程序时小心点,还有就是你的测试要做足
 
开发是选上, 等到测试完发布时不选, 提高效率
 
选上的作用就是在编写、调试时尽可能发现问题,开发时一定要选上

综合 snjat 和 tseug 的意见

测试要做足
开发是选上,
测试完发布时不选, 提高效率

最重要的一点:开发过程中尽量不是让 PPMM 骚扰,否则错误会猛增
 
iseaweb 可真会说啊,连PLMM也被扯进来了[:D]
 
开发时选上,充分测试后就不再会有这些错误了,故正式发布时就可把它去掉以提高少许效率
至于PLMM应该是没有影响的。[:D]
 
这两个选项是运行时候检察(runtime errors):
Range checking Checks that array and string subscripts are within bounds. Corresponds to {$R}.
Overflow checking Checks overflow for integer operations. Corresponds to {$Q}.
如果勾起来的话,运行时候就会加入校验代码。
比如你的sum是byte类型的,如果勾起来的话,运行时候他就会校验sum是否超过可能值(0到254
当你的sum超过255时候,明显超过byte上限,所以运行时候他就报错。
不想多说了,今天我多喝了酒,我想你应该明白我的意思:
你的程序校验不够完美!

第一个例子是range checking 的问题。解决方法,在你的程序里面控制sum(byte类型)
的范围,超过的话,报错,或者相应处理。

第二个例子你代码没给完整,我没办法分析。

关于OVERFLOW的描述。我是菜鸟,可能描述错误,高手别见笑,另外今天我生日,
我喝多了酒,大概7,8瓶酒吧:
每个程序编译后,都会在文件头给程序定义一个堆栈空间最大值,
如果你使用递归算法,或者动态数组(指程序运行的时候才能根据实际情况确定数组大小的数组)
或者其他算法,会导致程序所使用内存空间不确定的算法,则要加上OVERFLOW,在程序中加上运行
时候校验OVERFLOW的代码。
这样万一运行时候实际情况超过可能范围就会报错。
如果不加overflow的话,运行时候,用户给定的条件,或者程序运行时候的情况,导致你的算法所使用
的内存大大超过delphi编译时候默认的最大堆栈空间stack内存大小的话,就会出现不可预料的问题.


醉!!!!!!!!!!!!!!!!!!!!!!!!!!!!11.......................................

睡觉去.
 
呵呵,先顺祝楼上兄弟生日HAPPY, 不过老兄喝多了居然头脑那么清楚, 有机会肯定和你一拼!
 
给分吧?
1。看在我生日的份上
2。看在我毕业后几乎都在使用一些和delphi无关的程序语言份上(uniface,我想你没听说过
这种编程语言和工具吧?我好可怜哦。不过我不在乎,呵呵,做程序主要在方法,和工具无关的!!!
这狗屁东西我一个星期就比某些人学习n个月用得好,虽然我英语四级59.5分没过,虽然我学位没拿到,
只有毕业证书,不过我学习这种洋人的
东西还是很快的,程序风格,可维护性可修改性程序易读性都是不错的!!!哈哈哈,酒喝多了,所以
要撒酒疯罗.)
3.我好久没在delphi论坛发贴了,就跟我好酒没喝酒一样无聊。
good night.


工作两年,长了两岁,工资一分都没长,同学们一个个赚大钱去了,我一个人老老实实,
每做一个项目,就力图让自己的程序每个人看了都容易理解,容易维护,这样跳槽的时候,
别人也容易收拾我留下的不是很烂的摊子,不会随便找我麻烦。喜欢编程规范,软件工程的各种知识,努力让
自己的代码变得美丽。可是努力归努力,自己还是一样的没落,应该
是自己还没成熟的原因,努力吧!!!!加油吧,程序员们!

别怪自己没钱,怪自己没有好好的总结经验,怪自己没有好好的掌握一切方法吧。





哈哈哈哈.


你吐啊吐啊,就习惯我的言论了,嘿嘿。

我跟我同事说:过了今天我就老了一岁,同事说:是啊,人老得好快啊,他一脸的苍凉,
大大超乎了我的本意,我本来想引他说些壮志满怀的话,气愤!!!
大怒:人的一生很短暂,但是我努力,我学习,我进步,我鄙视所有不努力的人,
虽然我的gold 增长趋于0,但是我的的经验值狂长,我的lv又up,up,up....

呵呵,有什么可以遗憾的,等到lv99的时候,就应该到地狱或者天堂寻找另外一种
究级的lV up了。

 
delphi5开发人员指南29页有段话,支持iseaweb !
 
to 雪鹰 >
真是英雄没落啊!
深有同感,
做程序员太可怜了,要挣钱就得忍受剥削和欺骗,整个一部血泪史,
没money=没PLMM
 
后退
顶部