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์˜ ๋ฃจํ”„์˜€์Šต๋‹ˆ๋‹ค.
for (size_t k = 0; j> = 0 && k <sizeof (serialnumber); ++ k, j-= 2) {
๋ฌธ์ž ๋ฒ„ํผ [3] = {0};
memcpy (๋ฒ„ํผ, optarg + j, 2);
์ผ๋ จ ๋ฒˆํ˜ธ [๊ธธ์ด-k] = (uint8_t) strtol (buffer, NULL, 16);

"serialnumber"์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์˜ํ–ฅ์„๋ฐ›์Šต๋‹ˆ๋‹ค. ์˜๋„ ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์ฝ”๋“œ๋ฅผ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ "์ผ๋ จ ๋ฒˆํ˜ธ"์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ ์ง€์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. gcc-11์€ ๋ฐฐ์—ด ์ธ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ์•ก์„ธ์Šค๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์ง„๋‹จ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ํ•จ์ˆ˜๊ฐ€ ์ธ์ˆ˜๋ฅผ ๊ณ ์ • ๊ธธ์ด์˜ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜๋ฉด GCC๋Š” ์ „์ฒด ๋ฐฐ์—ด์ด ์ž ์žฌ์ ์œผ๋กœ ์ฐธ์กฐ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

stlink_open_usb๋Š” ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ 64 ๋ฐ”์ดํŠธ ๋ฌธ์ž ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์ง€๋งŒ "serialnumber"๋Š” 28 ๋ฐ”์ดํŠธ์— ๋ถˆ๊ณผํ•˜๋ฉฐ GCC๋Š” stlink_open_usb์— ์˜ํ•ด "serialnumber"์ธ์ˆ˜์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰