Поясняю: трап хреновый потому что он ровно из той же серии, что и разыменование невалидного (dangled) указателя в C/C++. Только в случае С/C++ никто не кричит, что такой трап штатный, а идут и фиксают Хотя, например, C++Builder из коробки такие трапы ловит не хуже ББ и ничего не падает (наследнику дельфи, чего с него взять).
Последствия/уязвимости у таких трапов, соответственно, точно такие же как и у традиционных небезопасных языков (форматирование жесткого диска и т.д. и т.п.).
Вообще то Blackbox вообще не умеет выгружать модули, он лишь умеет игнорировать "выгруженный" модуль при импорте и инвалидировать кодовую секцию (см. Kernel.UnloadMod). При этом модуль-зомби продолжает находиться в памяти до завершения процесса Blackbox.
Trap "illegal execution" просто показывает, что пытаются выполнять код без разрешения на чтение и исполнение, убранные при инвалидации. Можно сделать Trap информативнее следующими правками процедуры "DevDebug.Trap":
PROCEDURE Trap;
VAR a0: TextModels.Attributes; prop: Properties.StdProp; action: Action;
msg: ARRAY 512 OF CHAR
; mod: Kernel.Module;
BEGIN
out.ConnectTo(TextModels.CloneOf(StdLog.buf));
a0 := out.rider.attr;
out.rider.SetAttr(TextModels.NewWeight(a0, Fonts.bold));
IF Kernel.err = 129 THEN out.WriteSString("invalid WITH")
ELSIF Kernel.err = 130 THEN out.WriteSString("invalid CASE")
ELSIF Kernel.err = 131 THEN out.WriteSString("function without RETURN")
ELSIF Kernel.err = 132 THEN out.WriteSString("type guard")
ELSIF Kernel.err = 133 THEN out.WriteSString("implied type guard")
ELSIF Kernel.err = 134 THEN out.WriteSString("value out of range")
ELSIF Kernel.err = 135 THEN out.WriteSString("index out of range")
ELSIF Kernel.err = 136 THEN out.WriteSString("string too long")
ELSIF Kernel.err = 137 THEN out.WriteSString("stack overflow")
ELSIF Kernel.err = 138 THEN out.WriteSString("integer overflow")
ELSIF Kernel.err = 139 THEN out.WriteSString("division by zero")
ELSIF Kernel.err = 140 THEN out.WriteSString("infinite real result")
ELSIF Kernel.err = 141 THEN out.WriteSString("real underflow")
ELSIF Kernel.err = 142 THEN out.WriteSString("real overflow")
ELSIF Kernel.err = 143 THEN
out.WriteSString("undefined real result (");
out.WriteIntForm(Kernel.val MOD 10000H, TextMappers.hexadecimal, 4, "0", TextMappers.hideBase); out.WriteSString(", ");
out.WriteIntForm(Kernel.val DIV 10000H, TextMappers.hexadecimal, 3, "0", TextMappers.hideBase); out.WriteChar(")")
ELSIF Kernel.err = 144 THEN out.WriteSString("not a number")
ELSIF Kernel.err = 200 THEN out.WriteSString("keyboard interrupt")
ELSIF Kernel.err = 201 THEN
out.WriteSString("NIL dereference")
ELSIF Kernel.err = 202 THEN
out.WriteSString("illegal instruction: ");
out.WriteIntForm(Kernel.val, TextMappers.hexadecimal, 5, "0", TextMappers.showBase)
ELSIF Kernel.err = 203 THEN
IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL dereference (read)")
ELSE out.WriteSString("illegal memory read (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
END
ELSIF Kernel.err = 204 THEN
IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL dereference (write)")
ELSE out.WriteSString("illegal memory write (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
END
ELSIF Kernel.err = 205 THEN
IF (Kernel.val >= -4) & (Kernel.val < 65536) THEN out.WriteSString("NIL procedure call")
ELSE
mod := Kernel.modList;
WHILE (mod # NIL) & ~((mod.refcnt = -1) & (Kernel.val >= mod.code) & (Kernel.val < mod.code + mod.csize)) DO mod := mod.next END;
IF mod # NIL THEN
out.WriteSString('Call of unloaded module "'); out.WriteSString(mod.name); out.WriteChar('"')
ELSE out.WriteSString("illegal execution (ad = "); WriteHex(Kernel.val); out.WriteChar(")")
END
END
ELSIF Kernel.err = 257 THEN out.WriteSString("out of memory")
ELSIF Kernel.err = 10001H THEN out.WriteSString("bus error")
ELSIF Kernel.err = 10002H THEN out.WriteSString("address error")
ELSIF Kernel.err = 10007H THEN out.WriteSString("fpu error")
ELSIF Kernel.err < 0 THEN
out.WriteSString("Exception "); out.WriteIntForm(-Kernel.err, TextMappers.hexadecimal, 3, "0", TextMappers.showBase)
ELSE
out.WriteSString("TRAP "); out.WriteInt(Kernel.err);
IF Kernel.err = 126 THEN out.WriteSString(" (not yet implemented)")
ELSIF Kernel.err = 125 THEN out.WriteSString(" (call of obsolete procedure)")
ELSIF Kernel.err >= 100 THEN out.WriteSString(" (invariant violated)")
ELSIF Kernel.err >= 60 THEN out.WriteSString(" (postcondition violated)")
ELSIF Kernel.err >= 20 THEN out.WriteSString(" (precondition violated)")
END
END;
GetTrapMsg(msg);
IF msg # "" THEN out.WriteLn; out.WriteString(msg) END;
out.WriteLn; out.rider.SetAttr(a0);
out.WriteLn; ShowStack;
NEW(action); action.text := out.rider.Base();
Services.DoLater(action, Services.now);
out.ConnectTo(NIL)
END Trap;