> On Sep 19, 2015, at 11:00 AM, Sören Brinkmann <soren.brinkm...@xilinx.com> > wrote: > > Hi, > > I recently came across some bug in my program that I could narrow down > to the snipped below (also attached with a Makefile). > > extern unsigned int _vector_table;
You need the attribute weak here if the location of _vector_table can be a null pointer. Thanks, Andrew > > int main(void) > { > unsigned int *vector_base = &_vector_table; > > if (vector_base == 0) { > return 1; > } else { > return 2; > } > } > > The code generated for this function is (I tested a couple of different > compilers and architectures (4.7, 4.9 and 5.2)): > 0000000000000000 <main>: > 0: b8 02 00 00 00 mov $0x2,%eax > 5: c3 retq > > If my understanding is correct, this is a legal optimization under the > assumption that no object may reside at address 0, resulting in the > optimized out if branch. > Though, my understanding is that the switch > '-fno-delete-null-pointer-checks' would remove that assumption allowing > such code to be compiled "correctly" (I'm on an embedded system and code > at 0 is actually important). > > Could somebody tell me what the correct way for implementing something > like that would be? Or whether this is actually a gcc issue? > > Thanks, > Sören > <main.c> > <Makefile>