[comp.sys.mac.programmer] Think Pascal 3.0.2 generates incorrect code?

sigurasg@rhi.hi.is (Sigurdur Asgeirsson) (06/18/91)

  A friend of mine is starting to program XCMD's and wanted me to show him how
to concat two parameters into the result, so I wrote something like:

type
charArr = packed array [0..32767];
charPtr = ^charArr;
charHndl = ^charPtr;

...

Procedure Main(usual stuff)
var
len1, len2: integer;
result: charHndl;

begin
len1 = GetHandleSize(param1) - 1;
len2 = GetHandleSize(param2) - 1;
result = charHndl(NewHandle(len1 + len2 + 1);

... {HLock'em all}

BlockMove(param1^, result^, len1);
BlockMove(param2^, @result^^[len1], len2);
{So far so good, everything works till now (param n being parameter handle}
{no. n from parameter block)}

result^^[len1 + len2] := chr(0);
{this compiles to an ADD.W D0,D7 or some such, and then CLR.B (A0, D0.L)}
{instead of CLR.B (A0, D0.W), and some garbage in the high byte of D0,  }
{sending the zero byte to outer space (or inner space) corrupting the   }
{heap, crashing the mac, evoking a big laugh from my friend (who still  }
{doesn't believe that it's a compiler error).}

... {HUnlock'em all and put result into parameter block}

end;

  The XCMD was compiled with range checking and overflow checking on, with
Think Pascal 3.0.2 (upgraded from 3.0 I think).  Has anyone seen this before
or am I the first person in the world to be hit by this bug (or was it perhaps
only a bad dream)?

BTW: the code above was typed from memory, any errors result there from
(the darned thing worked after I changed the D0.L to D0.W with TMON).
-- 
sigurasg@rhi.hi.is  | "Well you know, C isn't that hard, void (*(*f[])())() for
Sigurdur Asgeirsson | instance defines f as an array of unspecified size, of
                    | pointers to functions returning a pointer to a function
                    | returning void... I think"

siegel@world.std.com (Rich Siegel) (06/19/91)

In article <3264@krafla.rhi.hi.is> sigurasg@rhi.hi.is (Sigurdur Asgeirsson) writes:
>
>result^^[len1 + len2] := chr(0);
>{this compiles to an ADD.W D0,D7 or some such, and then CLR.B (A0, D0.L)}
>{instead of CLR.B (A0, D0.W), and some garbage in the high byte of D0,  }
>{sending the zero byte to outer space (or inner space) corrupting the   }
>{heap, crashing the mac, evoking a big laugh from my friend (who still  }
>{doesn't believe that it's a compiler error).}

	This is indeed a bug. The workaround is to declare the upper array
bound as 32768, to force a sign extension of the index. This will be fixed in
the next release of THINK Pascal.

R.


-- 
-----------------------------------------------------------------------
Rich Siegel                              Internet: siegel@world.std.com
Software Engineer                        Applelink: SIEGEL
Symantec Languages Group