Stlink: La compilation avec GCC 11 échoue

Créé le 9 déc. 2020  ·  7Commentaires  ·  Source: stlink-org/stlink

Je ne peux pas construire stlink 1.6.1 avec le compilateur GCC 11. Fedora GNU / Linux Rawhide.
Les erreurs sont:

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

S'il vous plaît, aidez-moi à le corriger.

bucompilation buneeds-fix olinux staturesolved

Tous les 7 commentaires

Peut-être STLINK_SERIAL_MAX_SIZE define devrait être défini sur 28 ?

Vous pouvez réparer src/st-util/gdb-server.c :

static char serialnumber[28] = {0};

à

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

Je préfère voir le correctif en amont.

@Vascom moi aussi. Mais pour le réparer en amont, vous devez en vérifier le fonctionnement.

ps Vous avez créé une description de problème non conforme à un modèle. @ Nightwalker-87 peut le supprimer. Voir # 906

Oui cela fonctionne.

Le modèle ne se soucie pas des problèmes de compilation.

Le modèle est destiné à être utilisé et à être rempli avec un contenu qui comprend également une description. Alors s'il vous plaît, pensez-y la prochaine fois.

Vous pouvez réparer src/st-util/gdb-server.c :

static char serialnumber[28] = {0};

à

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

J'ai presque suggéré cela (j'ai initialement trouvé le problème de test de gcc-11 avec Fedora). Ma préoccupation à ce sujet était cette boucle dans gdb-server.c:
for (size_t k = 0; j> = 0 && k <sizeof (numéro de série); ++ k, j - = 2) {
tampon de caractères [3] = {0};
memcpy (tampon, optarg + j, 2);
numéro de série [longueur - k] = (uint8_t) strtol (tampon, NULL, 16);

Ce qui serait affecté par la modification de la taille du "numéro de série". Sans connaître l'intention ou le code en général, je ne me sentais pas à l'aise de recommander de changer la taille de "numéro de série".

Et pour donner aux gens un peu de contexte. gcc-11 a ajouté des diagnostics pour détecter les accès hors limites pour les arguments de tableau. En termes plus simples, si une fonction déclare un argument comme un tableau avec une longueur fixe, alors GCC suppose que le tableau entier pourrait potentiellement être référencé.

stlink_open_usb déclare son 3ème argument comme un tableau de 64 octets, pourtant "serialnumber" ne fait que 28 octets et GCC avertit naturellement parce qu'il pense qu'il y a un potentiel hors limites de l'argument "serialnumber" par stlink_open_usb.

Cette page vous a été utile?
0 / 5 - 0 notes