sscanf溢出目的地地址

时间:2019-02-18 10:58:16

标签: c string parsing embedded

我正在用C解析IP字符串,并且正在使用以下行:

# undo last commit while keeping changes in the working tree
git reset HEAD^

# redo the adding part without the unwanted files
git add file1 file2 file3

# commit and push
git commit -m "message"
git push --force origin HEAD

该行效果很好(它已正确解析),但在不应写入的地方进行了写。在带有“ XX”的内存地址中,值已正确存储,但带有“ AA”的内存地址被覆盖了“ 00”。

typedef unsigned char UI_8;
UI_8 TFTP_IP_NUMBERS[4];
UI_8 TFTP_IP[15]; // Should  be something lige "192.168.12.30" 
sscanf(TFTP_IP , "%d.%d.%d.%d", TFTP_IP_NUMBERS[0],
                                TFTP_IP_NUMBERS[1],
                                TFTP_IP_NUMBERS[2], 
                                TFTP_IP_NUMBERS[3]);

什么可能导致这种行为?如何避免这种情况

我希望有:

XX XX XX XX AA AA AA

1 个答案:

答案 0 :(得分:1)

%d格式说明符处理了一个int,您正在向它传递一个更小 unsigned char,并且还没有正确传递指针(两个错误)。 / p>

int ip_parts[4];
sscanf( ip, "%d.%d.%d.%d", &ip_parts[0], 
                           &ip_parts[1],
                           &ip_parts[2],
                           &ip_parts[4] ) ;

您可以使用unisigned char格式说明符直接写入%hhd,但是并非所有库都支持hh size修饰符,这会使代码的可移植性降低。您使用过UI8_t类型的事实表明您可能没有标准的uint8_t,因此可能未在使用与C99兼容的库或编译器-在这种情况下,%hhu也可能不起作用。

UI8 ip_parts[4];
sscanf( ip, "%hhu.%hhu.%hhu.%hhu", &ip_parts[0], 
                                   &ip_parts[1],
                                   &ip_parts[2],
                                   &ip_parts[4] ) ;