&引用;sprintf";esp idf中出现错误。msys2中的gcc版本9.1.0

&引用;sprintf";esp idf中出现错误。msys2中的gcc版本9.1.0,c,gcc,embedded,msys2,esp-idf,C,Gcc,Embedded,Msys2,Esp Idf,我之前在GCC6.4.0中使用msys2,当时正在为我的项目工作。我将工具链和gcc升级到9.1.0。现在我得到了这个错误: 代码的一小部分: memset(payload, 0, 8192); sprintf(payload, "GET %s%s HTTP/1.1\r\n", dynamic_fota_url, new_firmware_version); sprintf(payload, "%sHost: %s\r\n"

我之前在GCC6.4.0中使用msys2,当时正在为我的项目工作。我将工具链和gcc升级到9.1.0。现在我得到了这个错误:

代码的一小部分:

    memset(payload, 0, 8192);
    sprintf(payload, "GET %s%s HTTP/1.1\r\n", dynamic_fota_url, 
    new_firmware_version);
    sprintf(payload, "%sHost: %s\r\n", payload, dynamic_hostname);
    sprintf(payload, "%sPort: 443\r\n", payload);
    sprintf(payload, "%sAccept: */*\r\n\r\n", payload);
错误消息是:-

D:/dozee/dozee_compiler/msys32/home/esp-idf/examples/dozee_fw_v62/main/dozee_next.c:2092:12: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]
    sprintf(payload, "%sPort: 443\r\n", payload);
            ^~~~~~~                     ~~~~~~~
D:/dozee/dozee_compiler/msys32/home/esp-idf/examples/dozee_fw_v62/main/dozee_next.c:2093:12: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]
    sprintf(payload, "%sAccept: */*\r\n\r\n", payload);
            ^~~~~~~                           ~~~~~~~
D:/dozee/dozee_compiler/msys32/home/esp-idf/examples/dozee_fw_v62/main/dozee_next.c:2344:15: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]
       sprintf(payload, "%sHost: %s\r\n", payload, dynamic_hostname);
               ^~~~~~~                    ~~~~~~~
D:/dozee/dozee_compiler/msys32/home/esp-idf/examples/dozee_fw_v62/main/dozee_next.c:2345:15: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]
       sprintf(payload, "%sPort: 443\r\n", payload);
我怎样才能解决这个问题。如何将gcc降级到以前的版本

错误:传递参数1以限制参数3的限定参数别名

如何解决这个问题

不要将参数1别名为printf和任何其他参数

sprintf(some_buffer, "%s fmt string", some_different_buffer);
缓冲区别名无效,不允许这样做,并导致错误。写入和读取的缓冲区不允许重叠

使用
strcat
附加到字符串。或者通过移动与
sprintf
一起使用的缓冲区起始位置来计算偏移量并附加到缓冲区。更喜欢使用
snprintf
而不是
sprintf
snprintf
sprintf
返回写入的字节计数(不包括零终止字节),使用该计数。使用
snprintf
附加到缓冲区的典型用法如下所示:

char payload[200];
int len = snprintf(payload, sizeof(payload), "initialize");
len += snprintf(payload + len, sizeof(payload) - len, "Port: 443\r\n", payload);
len += snprintf(payload + len, sizeof(payload) - len, "Accept: */*\r\n\r\n", payload);

这是在sprintf的最新gcc编译器中添加的,因为当我使用旧gcc编译时,它工作正常。顺便说一句,谢谢你的建议,我将尝试这个实现。@MurlidharRoy它永远是未定义的行为;只是gcc在最近的版本中才开始警告它。@MurlidharRoy
它工作正常
是一个未定义行为的完美例子。为什么会出现此错误-
错误:'%d'指令将1到3字节之间的内容写入大小为2的区域[-Werror=格式溢出=]sprintf(增益str,'%d',live\u增益-30);3824:20:注意:指令参数的范围为[-30225]sprintf(增益str,“%d”,活动增益-30)^~~~3824:2:注意:'sprintf'将2到4字节之间的输出放入大小为2的目标sprintf(增益str,“%d”,活动增益-30)
这里char-gain\u-str[2]={0}和unit8\u-t-live\u-gain=0初始化,因为
%d
printf
格式说明符将
1
3
字节写入
2
字节的区域。就在描述里。