RT-Thread / rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS).
https://www.rt-thread.io
Apache License 2.0
10.46k stars 5.01k forks source link

bsp/stm32f10x/drivers/bxcan.c 运行时数组越界 #597

Closed sdmm closed 8 years ago

sdmm commented 8 years ago

在bsp/stm32f10x/drivers/bxcan.c中 static const rt_uint32_t bxcan_baud_rate_tab[] = { // 48 M MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 3), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_6tq, CAN_BS2_3tq, 6), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 5), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 11), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 23), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 29), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_12tq, CAN_BS2_3tq, 59), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_14tq, CAN_BS2_3tq, 149), MK_BKCAN_BAUD(CAN_SJW_2tq, CAN_BS1_16tq, CAN_BS2_8tq, 199), };

define BAUD_DATA(TYPE,NO) \

((bxcan_baud_rate_tab[NO] & TYPE##MASK) >> TYPE##SHIFT)

CAN_InitStructure.CAN_SJW = BAUDDATA(SJW, baud); 而在rt-thread/components/drivers/include/drivers/can.h里 enum CANBAUD { CAN1MBaud = 1000UL * 1000,/* 1 MBit/sec / CAN800kBaud = 1000UL * 800, / 800 kBit/sec / CAN500kBaud = 1000UL * 500, / 500 kBit/sec / CAN250kBaud = 1000UL * 250, / 250 kBit/sec / CAN125kBaud = 1000UL * 125, / 125 kBit/sec / CAN100kBaud = 1000UL * 100, / 100 kBit/sec / CAN50kBaud = 1000UL * 50, / 50 kBit/sec / CAN20kBaud = 1000UL * 20, / 20 kBit/sec / CAN10kBaud = 1000UL * 10 /_ 10 kBit/sec */ }; 当把CAN1MBaud作为参数传入时,BAUD_DATA(TYPE,CAN1MBaud) 造成数组越界。

gbcwbz commented 8 years ago

嗯,确实有这个问题。 @aozima 当初为什么要改这个呢, 在这里 defa6f37ff52bdd42ab754cf02e7e79c74b3457b