Interestingly, I just ran into "bad" code generation with exactly the properties
discussed in this thread.

Take a function like this:

function SignatureSubpacketTypeToStr(const X: TSignatureSubpacketType): String;
begin
  case X of
    sstReserved00     : Result:= 'Reserved00';
    sstReserved01     : Result:= 'Reserved01';
    sstCreationTime   : Result:= 'CreationTime';
....

Because every declared element is covered, the generated code for it ends up
being a computed goto:

   0x10047c4c <+28>:    mov    -0x4(%ebp),%al
   0x10047c4f <+31>:    and    $0xff,%eax
   0x10047c54 <+36>:    jmp    *0x10071d08(,%eax,4)

Which is perfectly fine if X is guaranteed to be in range of the elements the
case statement matches to. If it is not, as it may be with invalid input data
(as read from a file), that jump goes somewhere undefined - and most
importantly, not into any else statement.

So, while we have code that looks like Result is always properly initialized,
what we get instead is code that doesn't actually work. And no kind of DFA could
detect that, except also range-checking everything.

Just thought I'd share that, as a less synthetic example than some discussed 
here.


Regards,
Martok

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to