[Patch] Falscher RealSId-Wert in MtdMapSid()

  • In mtd.c/MtdMapSid() werden von der SID nur 13 Bits berücksichtigt (wie bei den Pids).

    Es ist aber ein 16 Bit Wert, und bei SIDs > 8191 ist das Resultat nicht mehr eindeutig.

    Dazu kommt, das InjectEit() die vollständige SID verwendet und damit eine andere uniqSid zugewiesen bekommt - diese kennt das CAM aber nicht.

    Der Patch im Anhang korrigiert das.


    Code
    Vorher:
    vdr[3005]: [3005] CAM 1/1: mapped SID 5909 (1715) to 256 (0100)
    vdr[8497]: [8614] CAM : InjectEit 14101 (3715)
    
    Nachher:
    vdr[9671]: [9671] CAM 1/1: mapped SID 14101 (3715) to 256 (0100)

    Helmut

  • Bei Anwendung des Patches erhalte ich folgende Compiler Warnung:


    Code
    C mtd.o
    g++ -g -O3 -Wall -march=native -Woverloaded-virtual -Wno-parentheses -fPIC -c -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -DREMOTE_KBD -DLIRC_DEVICE=\"/var/run/lirc/lircd\" -DVIDEODIR=\"/srv/vdr/video\" -DCONFDIR=\"/var/lib/vdr\" -DARGSDIR=\"/etc/vdr/conf.d\" -DCACHEDIR=\"/var/cache/vdr\" -DRESDIR=\"/usr/local/share/vdr\" -DPLUGINDIR=\"/usr/local/lib/vdr\" -DLOCDIR=\"/usr/local/share/locale\" -I/usr/include/uuid -I/usr/include/freetype2  -o mtd.o mtd.c
    mtd.c: In function 'void MtdMapSid(uchar*, cMtdMapper*)':
    mtd.c:227:21: warning: operation on 'p' may be undefined [-Wsequence-point]
       uint16_t rsid = *p++ << 8 | *p;
                        ~^~

    Gibt es eine Idee wie die Warnung nicht auftritt?

  • Ist mir nicht aufgefallen, wahrscheinlich habe ich-Wsequence-point nicht aktiviert.

    Hier dürfte gcc aber übervorsichtig sein - siehe hier.

    Ich werde es mr ansehen. Du kannst aber einmal das versuchen:

    uint16_t rsid = *p << 8 | *(++p);

    Helmut

    HelmutB passed unfortunately away on July 21, 2022 ... RIP 🖤

  • Man muss ja auch nicht immer alles in eine Zeile quetschen...

    Code darf gerne lesbar sein.


    Warum arbeitest du nicht mit [], da du ja sowieso wieder p-- machst?

  • Man muss ja auch nicht immer alles in eine Zeile quetschen...

    Also mir gefällt dieser Einzeiler eigentlich recht gut, aber darum gehts ja nicht.

    Die Warnung unterbleibt wenn man entweder die rsid Zuweisung in zwei Statements aufteilt oder mit p[0],p[1] arbeitet. Diese Variante ist nun im 2. Patch.


    Übrigens ist der nun erzeugte Assemblercode von MtdMapSid() absolut ident zum 1.Patch, die gcc Warnung war in diesem Fall also unnötig.


    Helmut

  • Das sieht doch viel besser aus. Jetzt kann man leicht erkennen, was da passiert und wenn der erzeugte Code sogar identisch ist, muss man den auch nicht "optimieren".


    Danke!

  • Zum "optimieren" gäbe es zumindest bei x86 schon etwas.

    Besseren/kürzeren Maschinecode gibt es da interessanterweise wenn der Einzeiler in 2 Statements aufgeteilt wird.

    Beim Einzeiler werden 2 Bytes einzeln gelesen und dann mit SHIFT und OR zu einem 16-bit Wert verknüpft - eigentlich so wie es geschrieben ist.

    Bei 2 Zuweisungen erfolgt gleich ein 16-Bit Zugriff und die beiden Bytes werden dann im 16-Bit Register mit einem "rotate" an die richtige Stelle gebracht.

    Das fällt aber eher in die Kategorie "Erbsenzählen" -Hauptsache das Ergebnis stimmt.

    Helmut

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!