Type safety could prevent nuclear war

tsbockman via Digitalmars-d digitalmars-d at puremagic.com
Thu Feb 4 22:46:03 PST 2016


On Friday, 5 February 2016 at 06:05:49 UTC, Chris Wright wrote:
> It doesn't know what targets I'm ultimately creating, and it 
> doesn't know what files have been modified that I'm about to 
> compile (but haven't compiled yet).
>
> Example 1:
>
> I compile one .c file referencing a function:
> void foo(int);
>
> That's going to end up in libfoo.so.
>
> I compile another .c file in the same directory defining a 
> function:
> void foo(float);
>
> That's going to end up in libbar.so.
>
> No bug here. (The linker should tell us if someone depends on 
> foo from libbar and foo from libfoo in the same executable.)
>
> How does your putative compiler plugin handle it? Either I have 
> to define a build rule for every source file to specify where 
> to put this symbol cache (and you need to add parameters for 
> the plugin to look for multiple caches, because libfoo and 
> libbar share a lot of source files), or the plugin gives me 
> false positives.
>
> Example 2:
>
> I compile a.c:
> int foo(int i) { return i + 1; }
>
> In the course of refactoring, I delete that function from a.c 
> and add it
> to b.c with modifications:
> int foo(int i, int increment) { return i + increment; }
>
> My build script recompiles b.c before it recompiles a.c. Your 
> compiler plugin produces a build error, halting my build. I 
> have to make clean && make in order to proceed -- and that's 
> assuming I know your tool doesn't work well with incremental 
> compilation.
>
> The first problem might be uncommon, but the second would crop 
> up constantly. They have the same fix: collect the information 
> when you compile, evaluate it when you link.

No spurious error is generated by my proposal in your example 2, 
because I specifically stated that the extra pass must be done 
once, after *all* modules have been compiled.

I see, however, that this would require one of:

1) Modifying build scripts to pass the complete list of .c files 
to the compiler in a single command, or
2) Modifying build scripts to run the compiler one extra time 
after processing all the .c files, or
3) Run the final check at link-time.

For a C tool chain with a clean-sheet design, any of those would 
handle example 2 fine. (1) or (3) could also handle example 1 
without issue.

However, as you say, only (3) is backwards compatible with 
existing make files and what-not. (This is not a limitation of 
the C language or ABI, though.)


More information about the Digitalmars-d mailing list