[SDL] Wo war (ist?) hier der Fehler

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

[SDL] Wo war (ist?) hier der Fehler

Beitrag von starcow »

Ich habe mir kürzlich einen Talk von Andrew Kelley über ZIG angeschaut (GOTO Conferences).
[youtube]https://youtu.be/YXrb-DqsBNU[/youtube]

In Minute 9 macht er auf einen Bug in der SDL aufmerksam, der vermutlich inzwischen behoben sein dürfte.
Allerdings ist mir nicht so recht klar, was daran denn nun genau UB war.
[youtube]https://youtu.be/YXrb-DqsBNU?t=542[/youtube]

Code: Alles auswählen

QuequeCmdSetDrawColor(SDL_Renderer *renderer, const Uint8 r, const Uint8 g, const Uint8 b, sonst Uint8 a)
{
	const Uint32 color = ((a << 24) | (r << 16) | (g << 8) | b);         // UB
	const Uint32 color = (((Uint32)a << 24) | (r << 16) | (g << 8) | b); // OK

	...
}
Da ja auf jeden Operanden beim Bitshift bekanntlich zuerst eine Ganzzahlerweiterung angewendet wird, habe ich ja ohnehin den Typ int. Zwar signed int - doch das spielt bei einem Links-Shift ja keine Rolle (Defined Behavior).
Beschränkt sich hier das UB auf Plattformen mit int < 32 Bit? Da dann die Ganzzahlerweiterung noch zu klein gewesen wäre, um a << 24 zu shiften?
Oder ist es der Umstand, dass der rechte Ausdruck neben der Zuweisung schliesslich den Typ int hätte - und nicht unsigned int (also ein cast von int zu Uint32 mit einer potentiell negativen Zahl)?
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [SDL] Wo war (ist?) hier der Fehler

Beitrag von Krishty »

a << 24

Beide Operanden promoten zu (signed) int. Wenn a größer als 127 ist, hast du hier den Overflow eines 32-Bit signed int, oder?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
starcow
Establishment
Beiträge: 523
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: [SDL] Wo war (ist?) hier der Fehler

Beitrag von starcow »

Ahhhh! X-) Danke Krishty!
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Antworten