在微控制器上,为了避免从以前的固件版本加载设置,我还存储了编译时间,该时间在加载时进行判断.

微控制器项目是从MikroElektronika开始用'mikroC PRO for ARM'建造的.

为了更容易调试,我在PC上用minGW编写了代码,并在左右判断后,将其放入microc.

使用该判断的代码无法正常工作.经过一晚令人沮丧的调试后,我发现101,并因此导致缓冲区溢出.

但现在我不知道是谁的错.

要重新创建问题,请使用以下代码:

#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

这种差异导致缓冲区溢出(指针的0字节-哎哟).

21是我期望的答案:20个字符和'\0'终止符.

这是C中"视情况而定"的事情之一,还是违反了sizeof操作符的行为?

推荐答案

这一切都是100%标准化的.C17 6.10.8.1:

__DATE__ The date of translation of the preprocessing translation unit: a character string literal of the form "Mmm dd yyyy" ... and the first character of dd is a space character if the value is less than 10.
...
__TIME__ The time of translation of the preprocessing translation unit: a character string literal of the form "hh:mm:ss"

  • ==同步,由Elderman更正==@elder_man
  • "hh:mm:ss"= 8
  • " "(用于字符串文字连接的空格)=1
  • 空终止=1

11+8+1+1=21

对于sizeof,字符串文字是一个array.无论何时将已声明的数组传递给sizeof,该数组都不会"衰减"为指向第一个元素的指针,因此sizeof将以字节为单位报告数组的大小.对于字符串文字,这包括空终止符C17 6.4.5:

在转换阶段7中,将值为零的字节或代码附加到由字符串文字或文字产生的每个多字节字符序列.然后使用多字节字符序列来 初始化静态存储持续时间和长度的数组,该数组恰好足以包含序列.

(还提到了翻译阶段6,这是字符串文字连接阶段.也就是说,在添加空值终止之前,字符串文字连接肯定会发生.)

因此,似乎mikroC PRO不符合要求/已被窃听.可以肯定的是,市场上有很多可疑的嵌入式系统编译器.

C++相关问答推荐

单指针和空参数列表之间的函数指针兼容性

难以理解Makefile隐含规则

如果我释放其他内容,返回值就会出错

在 struct 中强制转换空指针

在C++中使用函数指针的正确语法

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

Wcstok导致分段故障

为什么这个分配做得不好呢?

从不兼容的指针类型返回&&警告,但我看不出原因

C++中PUTS函数的返回值

从Raku nativecall调用时精度不同

Linux Posix消息队列

%g浮点表示的最大字符串长度是多少?

execve 不给出which命令的输出

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

OpenGL 中的非渐变 colored颜色 变化

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?

将字节/字符序列写入标准输出的最简单形式