This is the mail archive of the crossgcc@sources.redhat.com mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: ARM compiler misbehaves ?


Grant:


test_struct.test_short = 0x1234;
printf("%04x\n", test_struct.test_short);

_may_ work. I don't think it's guaranteed to work, though.


Actually, I'm pretty sure it is guaranteed to work as long as the compiler can see the "packed" attribute during compilation (if it couldn't, that would be a serious structural problem in your source code!).


test_pointer = &test_var.test_short;



test_pointer now points to an odd address. Dereferencing it will almost certainly not work right, since the compiler doesn't generate run-time checks for misaligned pointers.



*test_pointer = 0x789A;



Doing a 16-bit access to an odd address is undefined on ARM.



Yep. The above is 'bad day' code waiting to happen. Legal in "straight C", gets potentially broken when a non-portable, non-standard operation like the packed attribute is used.


If you aren't sure we're right, take out the "packed" attribute and try again. It should work fine then. Also, stop the debugger after the assignment to test_pointer and examine its value: it should be 16-bit aligned.



b.g.

--
Bill Gatliff
Professional embedded GNU training.
bgat@billgatliff.com




------ Want more information? See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/ Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]