From: Christoph S. <cs...@fr...> - 2008-11-03 09:09:10
|
Elnatan - On Fri, Oct 31, 2008 at 01:19:34PM -0400, Elnatan Reisner wrote: > CIL adds prototypes for functions that are called before they are > declared, but the transformations seem to treat the return value as an > integer regardless of the real return type. For example, the following > program prints '0' when run through CIL. This is because CIL passes the > value f(x) through a temporary *integer* variable, so the value is > truncated. > > #include <stdio.h> > int main() { > long long x = 0x100000001LL; > printf("%d\n",f(x) == x); > return 0; > } > long long f(long long x) { > return x; > } > > Now, that program doesn't compile with gcc because of conflicting types > for f (because the implicit declaration says it returns an int), so you > could say that all bets are off. Brilliant conclusion, Dr Watson! 1. Your example program is illegal C: In main() function f() is called without a prototype. The Standard says that every argument and the return type of such a function is "int". The definition of f (which includes a prototype) later on contradicts the declaration implied by the call earlier on. 2. Gcc is perfectly right in refusing this program. 3. You found a bug in Cil because it accepts bad code without an error message. > But I would think that the two reasonable options would be: > 1. Have CIL complain (like gcc does), rather than compile such code. > This means, I think, that missing prototypes should only be added for > functions with a return type of int. IMHO this is the correct way to go. Cil should flag the error and not generate an output file. Do You have a patch against the current svn that does accomplish this? > 2. Leave things as the types they are. > Compiling the program but casting back and forth from int seems to me > like an odd choice. Do others agree? No. We must never accept illegal code. /Chris -- Dr. Christoph L. Spiel |