[Oberon] Serious type loophole in type case statements and a possible fix
Andreas Pirklbauer
andreas_pirklbauer at yahoo.com
Sat Oct 31 00:44:43 CET 2020
This case below is now also caught by the modified compiler at [*]. A case
variable of a type case statement can now only be one of the following:
1. Local variables (pointer or record)
2. Pointer value parameters
3. Record VAR parameters
-ap
[*] http://github.com/andreaspirklbauer/Oberon-type-case-statement-without-loopholes
> When the compiler automatically generates a type guard (ORG.TypeTest)
> for all assignments to p in the CASE, shouldn’t that > catch your case?
> Br Jörg
> Am 30.10.2020 um 23:05 schrieb Michael Schierl <schierlm at gmx.de>:
>
> Hello Andreas,
>
>
>> Am 30.10.2020 um 14:05 schrieb Andreas Pirklbauer:
>> The official Oberon-07 compiler, as published at www.projectoberon.com,
>> contains a serious type loophole in type case statements
>>
>
> [...]
>
>
>> but continues to ALLOW…
>>
>> 1. Local variables or parameters (value or VAR) parameters as case variables
>
> I think this can be exploited:
>
> MODULE TestB;
> IMPORT Texts, Oberon;
>
> TYPE R0 = RECORD END;
> R1 = RECORD (R0) fld1: SET END;
> R2 = RECORD (R0) fld2: INTEGER END;
> P0 = POINTER TO R0;
> P1 = POINTER TO R1;
> P2 = POINTER TO R2;
>
> VAR p0: P0; p1: P1; p2: P2; W: Texts.Writer;
>
> PROCEDURE checkA(VAR p: P0);
> BEGIN
> CASE p OF P1:
> p0 := p2;
> p.fld1 := {4,1}
> END;
> Texts.WriteInt(W, p2.fld2, 4); (*18*)
> Texts.Append(Oberon.Log, W.buf)
> END checkA;
>
> PROCEDURE Go*;
> BEGIN p0 := p1; checkA(p0)
> END Go;
>
> BEGIN NEW(p1); NEW(p2); Texts.OpenWriter(W)
> END TestB.
>
>
> Using a real (but harmless) type confusion from SET to INTEGER to prove
> the point better :-)
>
> This can obviously can be more convoluted/sophisticated, and I can't
> think of an easy way to fix it without disallowing POINTER VAR
> parameters altogether.
>
>
> Regards,
>
>
> Michael
> --
More information about the Oberon
mailing list