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.
In the following functions, I count the amount of allocated memory.
Getting the alloc size fails with compiler optimization -Os balanced. The variable allocSize keeps always the init value 42. Doing the same access in 2 steps returns the correct value!
-Os balanced
And the same 1 step statement works in the osFreeMemTest() function!?
Do I have missed something in the C-syntax or is this a compiler bug?
#include <stdlib.h> static volatile uint32_t allocCount = 0; static volatile uint32_t freeCount = 0; static volatile uint32_t allocFreeDiff = 0; static volatile uint32_t allocTotal = 0; static volatile uint32_t allocTotal2 = 0; void * osAllocMemTest(size_t size) { volatile uint32_t allocSize = 42; volatile uint32_t * pAllocSize = 0; volatile uint32_t allocSize2 = 0; volatile void *p = 0; p = malloc(size); if (p == NULL) { //System reset as ultimate fault handling NVIC_SystemReset(); } allocCount++; allocFreeDiff = allocCount - freeCount; // code returns 42 with optimizing level -Os balanced, works only for -O0 and -O1 // because statement is skipped when optimized allocSize = *(((uint32_t *) p) - 1); // replacement with 2 steps works with optimization pAllocSize = ((uint32_t *) p) - 1; allocSize2 = *pAllocSize; allocTotal += allocSize; allocTotal2 += allocSize2; //Return a pointer to the newly allocated memory block return (void *) p; } /** * @brief Release a previously allocated memory block * @param[in] p Previously allocated memory block to be freed **/ void osFreeMemTest(void *p) { volatile uint32_t allocSize = 0; //Make sure the pointer is valid if(p != NULL) { freeCount++; allocFreeDiff = allocCount - freeCount; // works here with optimization -Os balanced allocSize = *(((uint32_t *) p) - 1); allocTotal -= allocSize; //Free memory block free(p); } }