We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I have been previously been using MDK-ARM V4.53 and have recently upgraded to V4.60. When using O2 optimisation I started getting a compiler "may be used before being set" warning that I never got with V4.53. I have provide some demo code below. In my view this is a compiler bug - do you agree?
typedef struct { unsigned int a : 2; unsigned int b : 2; } TEST1; TEST1 test1_global; typedef struct { unsigned int a; unsigned int b; } TEST2; TEST2 test2_global; int main( void ) { TEST1 test1_local; TEST2 test2_local; // the following gives "warning: C3017W: test1_local may be used before being set" test1_local.a = 1; test1_local.b = 1; test1_global = test1_local; // the following is OK test2_local.a = 1; test2_local.b = 1; test2_global = test2_local; return 0; }
I don't like to see any compiler warnings when I compile code that is to be shipped to a customer. This warning is "noise". You're right in that if I initialise the local structure
TEST1 test1_local = {0};
which takes up code space then the warning goes away but I prefer V4.53 behaviour. I guess uninitialsed "unused" bits could cause a problem in some cases such as if using the structure in a union containg another structure of ints which overlay the bit fields but this is dangerous in itself due to bit ordering non-portability.