Adaならそんなことにはならなかった
以前話題になっていたこの記事であるが、Adaの場合Segmentation Faultが起こる前に言語側で制約違反が起こるので、例外処理がきちんと出来ていれば即死を免れることが出来る。
procedure Pointer is
N :access Integer;
begin
begin
N.all := 5;
exception
when Constraint_Error =>
-- do something
end;
end Pointer;
いや、そもそもAdaならnot null access
があるので、このようなコードを書いてしまう状況になるかどうかも疑わしい。
procedure Pointer is
N : not null access Integer := new Integer'(5);
begin
-- do something
end Pointer;
この場合、宣言部で初期化をしないとコンパイラがwarningを吐くので間違いに気がつくことが出来る。
もちろん、毎回not null
を書くのは面倒であるし、もしかしたら書き忘れてしまうかもしれない。そういう場合は型自体を定義してしまえばいい。
procedure Pointer is
type Integer_Access is not null access Integer;
N : Integer_Access := new Integer'(5);
begin
-- do something
end Pointer
これで安心である。