我一直在尝试解决工作中的一个错误,终于找到了。事实证明,一个函数将一个大小为 uint16_t 的变量传递给另一个接受大小为 uint8_t 的变量的函数,即使没有任何显式转换。
每当检测到无效 ID 时,这会间歇性地导致软件内较低层的断言。
下面的代码显示了所发生事情的一个更简化的版本。
问题是调用函数的 ID 值不能大于 0xFF,即使它的大小为 uint16_t。因此,几乎所有时间都将值传递给被调用函数,该值是有效的。
有趣的是,问题/断言仅在启用大小优化时发生。
我很想知道这里到底会发生什么。我试图正确理解它。似乎传递的变量有时大于 0xFF(但不应该如此),然后在传递给函数时必须被截断,从而导致 ID 无效。
另外,下面简单地传递变量的效果是什么,而不是将变量转换为 uint8_t ,比如 func((uint8_t)ID); ?
我很惊讶编译器在我的情况下甚至没有对此发出警告。
已编辑:变量值导致混淆的代码示例
提前谢谢了。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void func(uint8_t);
int main()
{
uint16_t ID;
// more code
// ID gets assigned a value from 0 to 0xFF somewhere
//....
func(ID);
return 0;
}
void func(uint8_t ID )
{
// Processing of ID
//........
//........
printf("%x\n", ID);
}