【发布时间】:2021-12-10 09:58:22
【问题描述】:
我的代码有问题,因为 gcc 的想法似乎与我的不同。 这是问题的简化版本。
struct foo
{
uint16_t var;
};
struct foo foos[7];
struct foo foo;
uint16_t update_visual_alert(uint8_t match)
{
for(uint8_t i; i < 4;i++)
{
uint16_t color = 5;
if(match)
{
color = foos[i].var;
}
return color;
}
return 1;
}
用-01 GCC 正在切割
color = foos[i].var;
但它正在访问单个全局变量。
color = foo.var;
显然,它不会在没有优化或使用 volatile 关键字的情况下被剪切,无论是在颜色还是结构数组上。 但是添加
printf("%d",&color);
强制 gcc 也访问它们。 为什么 gcc 会优化它?
这是我在应用程序中使用的算法的简化版本,它导致了我忽略值的错误。
【问题讨论】:
-
for(uint8_t i; i < 4;= 访问未初始化的变量 = 任何事情都可能发生 -
谢谢,看来这就是根本原因。如此专注于奇怪的行为,我没有注意到这样的错误。
-
@BullNuk 欢迎您。
gcc -Wall其中包括-Wuninitialized是您的朋友,如果由于某种原因您无法编译时出现警告,您还有一个出色的工具:cppcheck --enable=all .(尽管名称为 cpp,它也适用于 C) -
如果您打算使用 Godbolt(这是个好主意),请在其分享按钮中包含实际的可分享链接。然后人们就可以实际试用代码并进行自己的微小更改,而仅凭屏幕截图是无法做到的。
标签: c gcc optimization