[M3devel] Unnecessary(?) range confusion in ThreadPosix.m3
Tony Hosking
hosking at cs.purdue.edu
Mon Oct 27 15:28:52 CET 2008
Sounds fair to me.
On 25 Oct 2008, at 04:16, Mika Nystrom wrote:
>
> Dear Modula-3 people,
>
> I had a crash in my program from a range error that I believe
> shouldn't have happened the way it did, although it's not in my
> code, so I'm not sure if there's a reason for the way it's done
> (matching
> a C declaration somewhere, maybe??).
>
> Here it is, from ThreadPosix.m3:
>
> PROCEDURE IOWait(fd: INTEGER; read: BOOLEAN;
> timeoutInterval: LONGREAL := -1.0D0): WaitResult =
> <*FATAL Alerted*>
> BEGIN
> self.alertable := FALSE;
> RETURN XIOWait(fd, read, timeoutInterval);
> END IOWait;
>
> PROCEDURE IOAlertWait(fd: INTEGER; read: BOOLEAN;
> timeoutInterval: LONGREAL := -1.0D0): WaitResult
> RAISES {Alerted} =
> BEGIN
> self.alertable := TRUE;
> RETURN XIOWait(fd, read, timeoutInterval);
> END IOAlertWait;
>
> PROCEDURE XIOWait (fd: CARDINAL; read: BOOLEAN; interval: LONGREAL):
> WaitResult
> RAISES {Alerted} =
> VAR res: INTEGER;
> fdindex := fd DIV FDSetSize;
> fdset := FDSet{fd MOD FDSetSize};
> ... rest omitted ...
>
> Note that IOWait calls XIOWait. IOWait is declared as taking an
> INTEGER, but XIOWait takes a CARDINAL.
>
> So I really should use a CARDINAL in passing to IOWait, but since
> IOWait is the interface function it's not clear that I should do
> that (until my program crashes after passing -1 from some carelessly
> wrapped C code). I don't like the fact that I get a range error
> *inside* the library when it appears unnecessary---it should have
> happened in my code, as I make the call.
>
> Suggested improvement: declare all the FDs in SchedulerPosix.i3
> (the interface that exports these routines) to be CARDINAL instead
> of INTEGER.
>
> Mika
More information about the M3devel
mailing list