叮
叮叮当当
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
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?:)