Reported by Bjrn Sahlen; checked by Reinier Sterkenburg
再現させるには、以下のコードをコンパイルし、実行します。
これはバグです、なぜなら:
もしコードに(私はないと思うが)何らかの間違いがあるなら、コンパイラがエラーを報告するべきです。しかし、実行時に次のメッセージが表示されます。
プロジェクト ... が EAccessViolation クラスの例外を生成しました。'モジュール '...' の アドレス ...'
Kylix では、振る舞いが少し違います:
TForm1.FormCreate の次の行
AObj.Prop:= 3;
ここで、SIGSEGV エラーが発生し、続いて Access Violation が発生します。
より詳しく調査(ステップ実行/トレース実行)してみると、プログラムは自発的に PROCEDURE IObj.Proc に飛び、そこでエラーが発生していることが明らかになります。
注意:これは最適化をオフにした状態で発生します。
どういうわけか、フィールド(プロパティ)のアドレスに関して混乱しているように見えます。
Delphi 1 では object 内のプロパティを許可していないため、このバグは存在しません。
コード
unit DelphiErr2U;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
TYPE
IObj= Object
// FieldThatMakesTheTotalFieldSizeGreaterThanFourBytes: Byte;
I: LongInt;
FUNCTION Func: LongInt;
PROCEDURE Proc (X: LongInt);
PROPERTY Prop: LongInt Read Func Write Proc;
END;
FUNCTION IObj.Func: LongInt;
BEGIN
Result:= 5;
END;
PROCEDURE IObj.Proc(X: LongInt);
BEGIN
I:= X + 1;
END;
procedure TForm1.Button1Click(Sender: TObject);
VAR AObj: IObj; Z: LongInt;
begin
AObj.Prop:= 3;
Z:= AObj.Prop;
Caption:= IntToStr(Z);
end; // この procedure を抜ける時に Access violation が発生する。
end.
|