在微控制器上,为了避免加载之前固件版本的设置,我还存储编译时间,在加载时检查该时间。
该微控制器项目是使用MikroElektronika 的“ mikroC PRO for ARM”构建的。
为了方便调试,我在PC上用minGW编写了代码,左右检查后,将其放入microC中。
使用该检查的代码无法正常工作。经过一晚令人沮丧的调试后,我发现sizeof("...")
在两个平台上产生了不同的值,并因此导致缓冲区溢出。
但现在我不知道是谁的错。
要重新创建问题,请使用以下代码:
#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));
在 MinGW 上它返回(如预期):
sizeof(#def): 21
sizeof(strA): 21
sizeof(strB): 21
但是,在“mikroC PRO for ARM”上,它返回:
sizeof(#def): 20
sizeof(strA): 20
sizeof(strB): 21
这种差异导致了缓冲区溢出(覆盖指针的字节零——哎呀)。
21 是我期望的答案:20 个字符和 '\0' 终止符。
这是 C 中“视情况而定”的事情之一,还是违反了sizeof
运算符行为?