Related articles |
---|
[11 earlier articles] |
Re: A lesson for compiler warning writers hagerman@ece.cmu.edu (1992-06-19) |
Re: A lesson for compiler warning writers igor!voltaire!davidm@uunet.UU.NET (1992-06-19) |
Re: A lesson for compiler warning writers dww@inf.fu-berlin.de (1992-06-20) |
Re: A lesson for compiler warning writers preston@dawn.cs.rice.edu (1992-06-21) |
Re: A lesson for compiler warning writers mjr@decuac.DEC.COM (1992-06-22) |
Re: A lesson for compiler warning writers prener@watson.ibm.com (1992-06-22) |
Re: A lesson for compiler warning writers derek@knosof.uucp (1992-06-22) |
Re: A lesson for compiler warning writers kendall@centerline.com (1992-06-23) |
Re: A lesson for compiler warning writers rjbodkin@theory.lcs.mit.edu (Ronald Bodkin) (1992-06-23) |
Re: A lesson for compiler warning writers mjr@decuac.DEC.COM (1992-06-23) |
Newsgroups: | comp.compilers |
From: | derek@knosof.uucp (Derek M Jones) |
Keywords: | C, lint |
Organization: | Compilers Central |
Date: | Mon, 22 Jun 1992 17:59:27 GMT |
>maniattb@cs.rpi.edu (Bill Maniatty) writes:
>I have said this before, in different forums, but perhaps not as clearly.
>Rigorous compiler checking is a Good Thing, but it is not enough. No C
>compiler in the world will do cross file checking for you, only lint does
Our compiler does full cross checking (well actually it
generates the info needed by our linker to do the job).
> file a.c:
>
> double foo(long a) { return a * 2.0 ; }
>
> file b.c
>
> #include <stdio.h>
> extern short foo(double a);
> int main(void) { printf("%d\n", foo(1.0)); return 0; }
>[the compiler and linker won't catch this]
>
>[I've always wondered how hard it would be to have a declarations database
>that compilers could consult and update as they compiled stuff. That must
>be a standard CASE thing. -John]
We sometimes call our intermediate code files a database. But this
terminology is more of an after thought.
For those of you into this sort of thing the following are good tests
of how well a cross module checker does it's job:
file 1: enum {a,b,c} x; file 2: enum {c=2, b=1, a=0} x;
the x's are compatible.
file 1: enum {a,b,c} x; file 2: enum {c=2, b=1, a=3} x;
the x's are not compatible (cross translation rules allow mixed
orderings but values must be the same).
file 1: int f(int); file 2: int f();
f's are compatible.
file 1: int f(char); file 2: int f();
f's are not compatible.
The rules that need to be followed when there are/aren't
prototypes in some modules and calls with out prototypes
are very complicated. So I will not give an example.
Also struct compatibility is by structure, not name. So what
about:
file 1:
struct s1{struct s2 *f1;} x;
struct s2{struct s1 *f1;};
file 2:
struct s1{struct s2 *f1;}x;
struct s2{struct s3 *f1;};
struct s3{struct s1 *f1;};
Are the x's compatible? Hint. You will need to refer to some recent
X3J11 interpretation answers.
derek jones
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.