GCC11コンパイラでstlink1.6.1をビルドできません。 Fedora GNU / LinuxRawhide。
エラーは次のとおりです。
/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
定義を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のこのループでした:
for(size_t k = 0; j> = 0 && k <sizeof(serialnumber); ++ k、j- = 2){
char buffer [3] = {0};
memcpy(buffer、optarg + j、2);
シリアル番号[長さ-k] =(uint8_t)strtol(buffer、NULL、16);
これは、「シリアル番号」のサイズを変更すると影響を受けます。 一般的な意図やコードを知らずに、「シリアル番号」のサイズを変更することを勧めるのは気が進まなかった。
そして人々に少し背景を与えるために。 gcc-11は、配列引数の範囲外アクセスを検出するための診断を追加しました。 簡単に言うと、関数が引数を固定長の配列として宣言している場合、GCCは配列全体が参照される可能性があると想定します。
stlink_open_usbは3番目の引数を64バイトの文字配列として宣言しますが、「シリアル番号」はわずか28バイトであり、GCCは、stlink_open_usbによる「シリアル番号」引数の範囲外の可能性があると考えているため、当然警告します。