Stlink: 使用GCC 11编译失败

创建于 2020-12-09  ·  7评论  ·  资料来源: stlink-org/stlink

我无法使用GCC 11编译器构建stlink 1.6.1。 Fedora GNU / Linux Rawhide。
错误是:

/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:90:22: error: 'stlink_open_usb' accessing 64 bytes in a region of size 28 [-Werror=stringop-overflow=]
   90 |                 sl = stlink_open_usb(st->logging_level, st->reset, serialnumber, 0);
      |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c: In function 'serve':
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:90:22: note: referencing argument 3 of type 'char *'
In file included from /builddir/build/BUILD/stlink-1.6.1/include/stlink.h:297,
                 from /builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:27:
/builddir/build/BUILD/stlink-1.6.1/src/usb.h:71:15: note: in a call to function 'stlink_open_usb'
   71 |     stlink_t *stlink_open_usb(enum ugly_loglevel verbose, int reset, char serial[STLINK_SERIAL_MAX_SIZE], int freq);
      |               ^~~~~~~~~~~~~~~
In function 'do_connect',
    inlined from 'do_connect' at /builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:87:18,
    inlined from 'main' at /builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:212:10:
/builddir/build/BUILD/stlink-1.6.1/src/st-util/gdb-server.c:90:22: error: 'stlink_open_usb' accessing 64 bytes in a region of size 28 [-Werror=stringop-overflow=]
   90 |                 sl = stlink_open_usb(st->logging_level, st->reset, serialnumber, 0);
      |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请帮我改正。

bucompilation buneeds-fix olinux staturesolved

所有7条评论

可能是STLINK_SERIAL_MAX_SIZE define应该设置为28吗?

您可以修复src/st-util/gdb-server.c

static char serialnumber[28] = {0};

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

我更喜欢在上游查看修复程序。

@Vascom我也是。 但是要在上游修复它,您需要检查它的工作。

ps您创建的问题描述与模板不符。 @ Nightwalker-87可能会删除它。 参见#906

是的,它有效。

模板不关心编译问题。

该模板旨在使用并填充内容,其中还包括说明。 因此,请下次考虑使用。

您可以修复src/st-util/gdb-server.c

static char serialnumber[28] = {0};

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

我差点建议(我最初发现用Fedora测试gcc-11的问题)。 我担心的是gdb-server.c中的此循环:
对于(size_t k = 0; j> = 0 && k <sizeof(serialnumber); ++ k,j-= 2){
字符缓冲区[3] = {0};
memcpy(buffer,optarg + j,2);
serialnumber [length-k] =(uint8_t)strtol(buffer,NULL,16);

更改“ serialnumber”的大小会受到影响。 在总体上不了解意图或代码的情况下,我不建议更改“ serialnumber”的大小。

并给人们一些背景知识。 gcc-11添加了诊断程序,以检测对数组参数的越界访问。 简单来说,如果函数将参数声明为具有固定长度的数组,则GCC假定可能会引用整个数组。

stlink_open_usb将其第三个参数声明为64个字节的字符数组,而“ serialnumber”仅为28个字节,GCC自然会发出警告,因为它认为stlink_open_usb可能会超出“ serialnumber”参数的范围。

此页面是否有帮助?
0 / 5 - 0 等级