Overflow Warnung



  • Hallo,

    ich bekomme eine Misra Warnung bei meiner Vorzeichen-Invertierung. Der Wert in "variable_SW" soll einfach negiert wieder drauf gespeichert werden.
    Das ganze läuft auf einem 32Bit RISC Controller.
    Kann jemand sagen, ob hier tatsächlich ein Fehler drin steckt? Ich verstehe die Meldung auch nicht ganz.

    typedef int16 SWORD;
    SWORD variable_SW;
    #define invertiere_vorzeichen(x)  (-(sint16)(x))
    
    variable_SW = invertiere_vorzeichen(variable_SW);
    
    
    

    Meldung:
    Cast on result of arithmetic computation may cause overflow: (SWORD)-(signed int)(sint16)variable_SW

    DIe Meldung beinhaltet 3 Typen:
    -> int16 (SWORD)
    -> signed int
    -> sint16

    Ich hätte gedacht, alle haben die Größe: 2 Bytes, und Bereich: -32,768 ... +32,767
    Sollte es nicht so sein?



  • @c_coder Was passiert bei -32768?



  • Ich hätte gedacht, alle haben die Größe: 2 Bytes, und Bereich: -32,768 ... +32,767

    Der Typ int wird auf dieser Plattform höchstwahrscheinlich ein 32-bit-Typ sein.



  • @Bashar

    das stimmt natürlich. Jede lokale Variable ist per standard hier ein 32 Bit Wert.
    Aber warum nimmt er "signed int" als lokalen Typ an, obwohl ich es doch auf sint16 caste ?
    Evtl. ist das Makro falsch - müsste ich es so schreiben:

    #define invertiere_vorzeichen(x)  (sint16)(-(x))
    

    ?



  • @DirkB sagte in Overflow Warnung:

    @c_coder Was passiert bei -32768?

    Laut Simulation es ist dann auch -32768.
    Weil eine Invertierung = +32768 wäre, was wiederum -32768 wegen dem Vorzeichen-Bit entspricht.
    Was kann man also tun um die Meldung zu eliminieren?



  • @c_coder sagte in Overflow Warnung:

    Aber warum nimmt er "signed int" als lokalen Typ an, obwohl ich es doch auf sint16 caste ?

    Weil bei der Verwendung der eingebauten arithmetischen Operatoren (wie dem hier verwendeten unären Minus), erstmal "integral promotion" passiert. D.h. alles was formal kleiner als int ist, wird erstmal zu int (bzw. wenn nötig unsigned int) gemacht.

    Für C hab ich jetzt keinen Link parat, aber die entsprechende Regel für C++ kannst du hier nachlesen:
    https://en.cppreference.com/w/cpp/language/implicit_conversion#Numeric_promotions
    Die selbe Regel existiert AFAIK in sehr ähnlicher Form für C.

    D.h. wenn du eine Variable x vom Typ short hast, dann ist der Wert des Ausdrucks x vom Typ short, aber die Werte von -x, +x, x-0 und x+0 sind alle vom Typ int.

    Was kann man also tun um die Meldung zu eliminieren?

    Was du schon selbst vorgeschlagen hast sollte funktionieren: #define invertiere_vorzeichen(x) (sint16)(-(x))
    Allerdings frage ich mich was es bringt das hinter einem Makro zu verstecken. Aber das ist wieder ein anderes Thema.