在微控制器上,为了避免加载之前固件版本的设置,我还存储编译时间,在加载时检查该时间。
\n该微控制器项目是使用MikroElektronika 的“ mikroC PRO for ARM”构建的。
\n为了方便调试,我在PC上用minGW编写了代码,左右检查后,将其放入microC中。
\n使用该检查的代码无法正常工作。经过一晚令人沮丧的调试后,我发现sizeof("...")在两个平台上产生了不同的值,并因此导致缓冲区溢出。
但现在我不知道这是谁的错。
\n要重新创建问题,请使用以下代码:
\n#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__\n\nchar strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];\nchar strB[] = SAVEFILECHECK_COMPILE_DATE;\n\nprintf("sizeof(#def): %d\\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));\nprintf("sizeof(strA): %d\\n", (int)sizeof(strA));\nprintf("sizeof(strB): %d\\n", (int)sizeof(strB));\nRun Code Online (Sandbox Code Playgroud)\n在 MinGW 上它返回(如预期):
\n#define SAVEFILECHECK_COMPILE_DATE __DATE__ " " __TIME__\n\nchar strA[sizeof(SAVEFILECHECK_COMPILE_DATE)];\nchar strB[] = SAVEFILECHECK_COMPILE_DATE;\n\nprintf("sizeof(#def): %d\\n", (int)sizeof(SAVEFILECHECK_COMPILE_DATE));\nprintf("sizeof(strA): %d\\n", (int)sizeof(strA));\nprintf("sizeof(strB): %d\\n", (int)sizeof(strB));\nRun Code Online (Sandbox Code Playgroud)\n然而,在“mikroC PRO for ARM”上,它返回:
\nsizeof(#def): 21\nsizeof(strA): 21\nsizeof(strB): 21\nRun Code Online (Sandbox Code Playgroud)\n这种差异导致了缓冲区溢出(覆盖了指针 \xe2\x80\x93 的字节零)。
\n21 是我期望的答案:20 个字符和 \'\\0\' …