我无法使用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);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
请帮我改正。
可能是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”参数的范围。