mikrocontroller.net

Forum: Compiler & IDEs Frage zu UB bei Mischung von C und C++


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kaj G. (Firma: RUB) (bloody)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

folgendes Gedankenspiel:

Ich habe in einer Datei A C++-Code und in einer Datei B habe ich C-Code. 
Der C-Code enthaelt Code, der in C i.O. ist, aber in C++ UB ausloesen 
wuerde (z.B. typepunning mit unions).

Datei A wird als C++, Datei B als C compiliert. Wenn ich das jetzt 
zusammenlinke, habe ich dann UB oder nicht? Ist es fuer diese Frage 
wichtig, ob der C-Code aus C++, oder C++-Code aus C heraus aufgerufen 
wird?

Gruesse

von Heiko L. (zer0)


Bewertung
2 lesenswert
nicht lesenswert
Linken ändert nicht das Verhalten von Funktionen. Solange du echt 
sicherstellen kannst, dass da jeweils der richtige Compiler genommen 
wird, sollte das funktionieren. Es ist gängige Praxis irgendwelche 
C-libraries auch statisch mit C++ Code zu linken.

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kaj G. schrieb:
> Ich habe in einer Datei A C++-Code und in einer Datei B habe ich C-Code.
> Der C-Code enthaelt Code, der in C i.O. ist, aber in C++ UB ausloesen
> wuerde

Gibt's das überhaupt?

> (z.B. typepunning mit unions).

Das ist doch auch in C UB, oder?

von vn nn (Gast)


Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> Gibt's das überhaupt?

Natürlich.
Vermutlich würde er sonst auch nicht fragen.

DPA schrieb:
>> (z.B. typepunning mit unions).
>
> Das ist doch auch in C UB, oder?

https://en.wikipedia.org/wiki/Type_punning#Use_of_union

> Accessing [one member] after initializing the other member [...], is
> still a form of type-punning[2] in C and the result is unspecified
> behavior[3] (and undefined behavior in C++ [4]).
>
> ---
>
> 2. "§ 6.5.2.3/3, footnote 97", ISO/IEC 9899:2018 (PDF), 2018, p. 59, "If
> the member used to read the contents of a union object is not the same as
> the member last used to store a value in the object, the appropriate part
> of the object representation of the value is reinterpreted as an object
> representation in the new type as described in 6.2.6 (a process sometimes
> called “type punning”). This might be a trap representation."
> 
https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
> 3.  "§ J.1/1, bullet 11", ISO/IEC 9899:2018 (PDF), 2018, p. 403, "The
> following are unspecified: … The values of bytes that correspond to union
> members other than the one last stored into (6.2.6.1)."
> 
https://web.archive.org/web/20181230041359if_/http://www.open-std.org/jtc1/sc22/wg14/www/abq/c17_updated_proposed_fdis.pdf
> 4. ISO/IEC 14882:2011 Section 9.5

Unspecified vs. undefined!

> 3.28 Undefined behavior: behavior for which this International Standard
> imposes no requirements
> 3.29 Unspecified behavior: behavior, for a well-formed program construct
> and correct data, that depends on the implementation
> 3.12 Implementation-defined behavior: behavior, for a well-formed program
> construct and correct data, that depends on the implementation and that
> each implementation documents

von Wilhelm M. (wimalopaan)


Bewertung
-2 lesenswert
nicht lesenswert
Das Thema typepunning w/ unions ist einfach nicht tot zu kriegen.

: Bearbeitet durch User
von zero to go (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Vermutlich weil gcc das erlaubt.

von Kaj G. (Firma: RUB) (bloody)


Bewertung
0 lesenswert
nicht lesenswert
Wilhelm M. schrieb:
> Das Thema typepunning w/ unions ist einfach nicht tot zu kriegen.
Es geht hier nicht um das typepunning. Das war lediglich ein Beispiel um 
zu verdeutlichen was gemeint ist.

DPA schrieb:
> Das ist doch auch in C UB, oder?
Wurde mit C99 erlaubt.
Beitrag "Re: Unions in C vs. Types in Freepascal/Delphi/Pascal"

Gruesse

: Bearbeitet durch User
von Olav (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nimm doch einfach memcpy in C bzw. std::memcpy in C++. Ergibt 
identischen Code zu type punning mit unions und ist klar definiert in C 
und in C++.

von Wilhelm M. (wimalopaan)


Bewertung
-1 lesenswert
nicht lesenswert
Kaj G. schrieb:
> Es geht hier nicht um das typepunning.

Ok, warum bringst Du dann das Beispiel, wenn es nicht darum geht?

von Heiko L. (zer0)


Bewertung
0 lesenswert
nicht lesenswert
Olav schrieb:
> Nimm doch einfach memcpy in C bzw. std::memcpy in C++. Ergibt
> identischen Code zu type punning mit unions und ist klar definiert in C
> und in C++.

Aber leider nicht constexpr...

von Wilhelm M. (wimalopaan)


Bewertung
0 lesenswert
nicht lesenswert
Heiko L. schrieb:
> Olav schrieb:
>> Nimm doch einfach memcpy in C bzw. std::memcpy in C++. Ergibt
>> identischen Code zu type punning mit unions und ist klar definiert in C
>> und in C++.
>
> Aber leider nicht constexpr...

Wir warten alle auf std::bit_cast

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.