On Thu, May 14, 2020 at 1:56 PM Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> wrote: > > the static definition of foo() and the extern declaration are > distinct symbols (in the sense that neither has its sym->same_symbol > pointing to the other). As far as I understand, this is correct > because they have a different 'scope'. So it looks like gcc disagrees. Gcc thinks they are the same symbol. It allows you to re-define it as static vs external, but it needs to be defined to the same thing. So yes, "extern" and "static" have different external visibility, but the scope of the symbol is the same (file scope), and it's the same symbol. I didn't check the standard for how it's supposed to work, but I wrote this silly test program: static int __attribute__((noinline)) external(void) { return 0; } static int __attribute__((noinline)) internal(void) { return 1; } extern int __attribute__((alias("external"))) a(void); static int __attribute__((alias("internal"))) a(void); int main(int argc, char **argv) { return a(); } to see which one gcc would pick - if it considered them separate symbols. And gcc refuses to compile it with error: redefinition of ‘a’ which is admittedly very sane. So I think sparse is in the wrong here, and we should consider both external and static symbols to be in the same scope and conflict with each other unless their declarations match. Linus