esp-idf中的“ sprintf”错误。 MCC2中的GCC版本9.1.0

时间:2020-07-04 08:41:32

标签: c gcc embedded msys2 esp-idf

我之前在gcc 6.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 个答案:

答案 0 :(得分:1)

错误:将参数1传递给参数3的限定条件的参数别名

如何解决此问题。

请勿将参数1与其他任何参数混用到printf。

no= (container)  yes=  container
no= (shadow-lg)  yes=  shadow-lg

别名缓冲区无效,不允许这样做,结果为undefined behavior。您写入和读取的缓冲区不允许重叠。

使用sprintf(some_buffer, "%s fmt string", some_different_buffer); 附加到字符串。或通过偏移与strcat一起使用的缓冲区起始位置来计算偏移量并追加到缓冲区。最好使用sprintf而不是snprintfsprintfsnprintf返回写入的字节数(不包括零终止字节),请使用该计数。用sprintf追加到缓冲区的典型用法如下:

snprintf