Em um microcontrolador, para evitar o carregamento de configurações de uma versão anterior do firmware, também armazeno o tempo de compilação, que é verificado no carregamento.
O projeto do microcontrolador é construído com 'mikroC PRO for ARM' da MikroElektronika .
Para ser mais fácil de depurar, programei o código com minGW no meu PC e, após verificar à esquerda e à direita, coloquei-o no microC.
O código que usou essa verificação não funcionou corretamente. Depois de uma noite de depuração frustrante, descobri sizeof("...")
que produzia valores diferentes nas duas plataformas e, como consequência, causava um estouro de buffer.
Mas agora não sei de quem é a culpa.
Para recriar o problema, use o seguinte código:
#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__
char strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];
char strB[] = SAVEFILECHECK_COMPILE_DATE;
printf("sizeof(#def): %d\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));
printf("sizeof(strA): %d\n", (int)sizeof(strA));
printf("sizeof(strB): %d\n", (int)sizeof(strB));
No MinGW ele retorna (conforme esperado):
sizeof(#def): 21
sizeof(strA): 21
sizeof(strB): 21
Porém, no 'mikroC PRO for ARM' ele retorna:
sizeof(#def): 20
sizeof(strA): 20
sizeof(strB): 21
Essa diferença causou um estouro de buffer na linha (sobrescrevendo o byte zero de um ponteiro – ai).
21 é a resposta que espero: 20 caracteres e o terminador '\0'.
Esta é uma das coisas que 'depende' em C ou há uma violação do sizeof
comportamento do operador?