Stlink: Die Kompilierung mit GCC 11 schlägt fehl

Erstellt am 9. Dez. 2020  ·  7Kommentare  ·  Quelle: stlink-org/stlink

Ich kann stlink 1.6.1 nicht mit dem GCC 11-Compiler erstellen. Fedora GNU / Linux Rawhide.
Fehler sind:

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

Bitte helfen Sie mir, das zu korrigieren.

bucompilation buneeds-fix olinux staturesolved

Alle 7 Kommentare

Kann STLINK_SERIAL_MAX_SIZE define auf 28 ?

Sie können src/st-util/gdb-server.c reparieren:

static char serialnumber[28] = {0};

zu

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

Ich bevorzuge es, Fix in Upstream zu sehen.

@ Vascom ich auch. Aber um es im Upstream zu beheben, müssen Sie die Funktionsweise überprüfen.

ps Sie haben eine Problembeschreibung erstellt, die nicht einer Vorlage entspricht. @ Nightwalker-87 kann es löschen. Siehe # 906

Ja es funktioniert.

Die Vorlage kümmert sich nicht um Kompilierungsprobleme.

Die Vorlage soll verwendet und mit Inhalten gefüllt werden, die auch eine Beschreibung enthalten. Bitte bedenken Sie dies beim nächsten Mal.

Sie können src/st-util/gdb-server.c reparieren:

static char serialnumber[28] = {0};

zu

static char serialnumber[STLINK_SERIAL_MAX_SIZE] = {0};

Ich hätte das fast vorgeschlagen (ich fand ursprünglich das Problem beim Testen von gcc-11 mit Fedora). Mein Anliegen dabei war diese Schleife in gdb-server.c:
für (size_t k = 0; j> = 0 && k <sizeof (Seriennummer); ++ k, j - = 2) {
Zeichenpuffer [3] = {0};
memcpy (Puffer, optarg + j, 2);
Seriennummer [Länge - k] = (uint8_t) strtol (Puffer, NULL, 16);

Dies würde durch die Änderung der Größe der "Seriennummer" beeinflusst. Ohne die Absicht oder den Code im Allgemeinen zu kennen, fühlte ich mich nicht wohl, wenn ich empfahl, die Größe der "Seriennummer" zu ändern.

Und um den Leuten ein bisschen Hintergrundwissen zu geben. gcc-11 hat eine Diagnose hinzugefügt, um außerhalb der Grenzen liegende Zugriffe auf Array-Argumente zu erkennen. Im einfachsten Fall geht GCC davon aus, dass möglicherweise auf das gesamte Array verwiesen werden kann, wenn eine Funktion ein Argument als Array mit fester Länge deklariert.

stlink_open_usb deklariert sein drittes Argument als 64-Byte-Zeichenarray, doch "Seriennummer" beträgt nur 28 Byte, und GCC warnt natürlich, weil es glaubt, dass das Argument "Seriennummer" von stlink_open_usb möglicherweise außerhalb der Grenzen liegt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen