Stlink: A compilação com GCC 11 falha

Criado em 9 dez. 2020  ·  7Comentários  ·  Fonte: stlink-org/stlink

Não consigo construir o stlink 1.6.1 com o compilador GCC 11. Fedora GNU / Linux Rawhide.
Os erros são:

/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);
      |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Por favor me ajude a corrigir isso.

bucompilation buneeds-fix olinux staturesolved

Todos 7 comentários

Pode ser STLINK_SERIAL_MAX_SIZE define deve ser definido como 28 ?

Você pode corrigir src/st-util/gdb-server.c :

static char serialnumber[28] = {0};

para

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

Eu prefiro ver a correção no upstream.

@Vascom eu também. Mas para consertá-lo no upstream, você precisa verificar o funcionamento dele.

ps Você criou uma descrição do problema que não está de acordo com um modelo. @ Nightwalker-87 pode excluí-lo. Veja # 906

Sim, funciona.

O modelo não se preocupa com problemas de compilação.

O modelo deve ser usado e preenchido com conteúdo que também inclui uma descrição. Portanto, considere isso na próxima vez.

Você pode corrigir src/st-util/gdb-server.c :

static char serialnumber[28] = {0};

para

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

Quase sugeri isso (originalmente encontrei o problema ao testar o gcc-11 com o Fedora). Minha preocupação com isso era este loop em gdb-server.c:
para (size_t k = 0; j> = 0 && k <sizeof (número de série); ++ k, j - = 2) {
buffer char [3] = {0};
memcpy (buffer, defenderg + j, 2);
número de série [comprimento - k] = (uint8_t) strtol (buffer, NULL, 16);

Que seria afetado pela alteração do tamanho do "número de série". Sem saber a intenção ou o código em geral, não me senti confortável em recomendar a alteração do tamanho do "número de série".

E para dar às pessoas um pouco de história. O gcc-11 adicionou diagnósticos para detectar acessos fora dos limites para argumentos de array. Em termos mais simples, se uma função declara um argumento como um array com um comprimento fixo, então o GCC assume que o array inteiro pode ser referenciado.

stlink_open_usb declara seu terceiro argumento como uma matriz de caracteres de 64 bytes, mas "número de série" tem apenas 28 bytes e o GCC avisa naturalmente porque pensa que há um potencial fora dos limites do argumento "número de série" de stlink_open_usb.

Esta página foi útil?
0 / 5 - 0 avaliações