值 0x0c 后 C 中的静态变量重置
Static variable resetting in C after value 0x0c
我正在尝试从远程设备读取连续数据,并且声明了静态变量来接收和发送 ACK 。 Payload of 0 and 1
保存我从远程设备获取的数据的序列号。
我遇到的问题是变量 fragment_num
。达到 0x0c
后,它会重置回 0。
它的免费 RTOS 应用程序。静态变量重置为 0 是否有任何明显的原因,或者我的代码是否有任何问题?谢谢
#define INTIAL_FRAGMENT 0x00
static uint8_t length;
static uint8_t fragment_num ;
uint8_t image[128];
download ()
{
if(((payload[1] << 8) | (payload[0])) == INTIAL_FRAGMENT)
{
memset(image , 0,128);
memcpy(image , payload,(len));
info_download();
length = len;
fragment_num +=1 ;
}
if(((payload[1] << 8) | (payload[0])) == fragment_num)
{
memcpy((image+length+1) , payload,(len));
length += len;
fragment_num ++;
info_download();
}
问题可能是缓冲区溢出。
static uint8_t fragment_num ;
uint8_t image[128];
编译器可能在内存中 image
之后布置了 fragment_num
。如果 length
或 len
不正确,则 memcpy()
可以写入 image
的末尾并覆盖 fragment_num
.
的值
memcpy((image+length+1) , payload,(len));
我相信您在这里想要 (image+length)
而不是 (image+length+1)
。添加一个会跳过一个字节。
您可能还应该在 memcpy()
之前验证 len
以确保它不会溢出,例如:
if (len > 128)
return -1;
memcpy(image, payload, len);
if (length + len > 128)
return -1;
memcpy(image + length, payload, len);
我正在尝试从远程设备读取连续数据,并且声明了静态变量来接收和发送 ACK 。 Payload of 0 and 1
保存我从远程设备获取的数据的序列号。
我遇到的问题是变量 fragment_num
。达到 0x0c
后,它会重置回 0。
它的免费 RTOS 应用程序。静态变量重置为 0 是否有任何明显的原因,或者我的代码是否有任何问题?谢谢
#define INTIAL_FRAGMENT 0x00
static uint8_t length;
static uint8_t fragment_num ;
uint8_t image[128];
download ()
{
if(((payload[1] << 8) | (payload[0])) == INTIAL_FRAGMENT)
{
memset(image , 0,128);
memcpy(image , payload,(len));
info_download();
length = len;
fragment_num +=1 ;
}
if(((payload[1] << 8) | (payload[0])) == fragment_num)
{
memcpy((image+length+1) , payload,(len));
length += len;
fragment_num ++;
info_download();
}
问题可能是缓冲区溢出。
static uint8_t fragment_num ;
uint8_t image[128];
编译器可能在内存中 image
之后布置了 fragment_num
。如果 length
或 len
不正确,则 memcpy()
可以写入 image
的末尾并覆盖 fragment_num
.
memcpy((image+length+1) , payload,(len));
我相信您在这里想要 (image+length)
而不是 (image+length+1)
。添加一个会跳过一个字节。
您可能还应该在 memcpy()
之前验证 len
以确保它不会溢出,例如:
if (len > 128)
return -1;
memcpy(image, payload, len);
if (length + len > 128)
return -1;
memcpy(image + length, payload, len);