溢出?找不到来源,奇怪

overflow? cannot find source, strange

我的项目中有以下两个结构

typedef volatile struct {
  unsigned char rx_buf[MAX_UART_BUF];   //Input buffer over UART
  uint8_t rx_flag;                  //Indicates received data over UART
  uint8_t rx_length;                    //length of the input buffer
} UART;

UART *gUART;

typedef volatile struct {
  unsigned int target_s[NR_BLDC];       //Target Position in Signals
  int distance_s[NR_BLDC];          //Distance between gActual_s[NR_BLDC] and gTarget_s
  unsigned int old_s[NR_BLDC];      //Position before starting to new destination
  unsigned int ramp_s[NR_BLDC];     //Duration of ramp(accelerate/decelerate) in Signals
  unsigned int count_dt[NR_BLDC];       //Actual nr of PWM ISR timer calls
  uint8_t dc_max[NR_BLDC];          //Maximal Duty Cycle set to reach the destination
} POSITIONING;

POSITIONING *gPOS;

当我在 *gUART 中写入 rx_flag 或 rx_length 时,它以某种方式更改了 *gPOS 结构中 distance_s[0] 的内容(执行其中一个时发生错误下面代码部分中的两行)。 i 是 uint8_t 类型并且在限制范围内。

            gUART->rx_length = i;                       //set receive byte length
            gUART->rx_flag = 1;                         //Indicate that data ready for use

我不知道这是怎么发生的,因为即使它是溢出,两个结构至少在 bss 部分中被多个字节分隔。

任何tricks/ideas如何找到错误。

提前致谢

由于您没有显示更多代码,我必须做出两个假设:前缀为 g 的变量是全局变量,并且您没有初始化这些指针(即使它们指向任何地方)。

未初始化的全局变量由编译器零初始化。对于指针,这意味着它们被初始化为 NULL,这意味着两个指针都指向 NULL。取消引用 NULL 指针会导致 undefined behavior.

在你的具体情况下,你很幸运整个应用程序不会崩溃和燃烧,更具体地说,因为两个指针都指向 NULL 它们都指向相同的内存,这意味着改变一个结构将改变两者。

要么您需要实际使指针指向某处,要么根本不将它们声明为指针。