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์ ๋ฃจํ์์ต๋๋ค.
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"์ธ์์ ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ๊ฒฝ๊ณ ํฉ๋๋ค.