Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

1

28.05.2009, 01:15

glUniform() inkonsistentes Verhalten in Debug/Release Build

Abgetrennt von hier: https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=11830


Zitat von »"Moe"«

Der Compiler verhält sich unterschiedlich im Release und Debug Modus. Im Debug-Modus werden alle Variablen automatisch initialisiert und haben teilweise andere Datentypen als im Releasemodus (bool wird z.B. zu einem integer im Debugmodus).


Sry aber das is Blödsinn ;)

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

2

29.05.2009, 00:12

Zitat von »"dot"«

Zitat von »"Moe"«

Der Compiler verhält sich unterschiedlich im Release und Debug Modus. Im Debug-Modus werden alle Variablen automatisch initialisiert und haben teilweise andere Datentypen als im Releasemodus (bool wird z.B. zu einem integer im Debugmodus).


Sry aber das is Blödsinn ;)

Bei VS2k5 ist es definitiv so. Das mit den Datentypen merkt man auf sehr unangenehme Weise mit glUniform, das im Debug Modus mit bool funktioniert, nicht jedoch im Releasemodus (okay, in OGL 3.x habe ich es noch nicht getestet).

Die Initialisierung merkt man bei so ziemlich allen Zeigern, die man nicht initialisiert, aber sonst sauber behandelt (also vor Neuzuweisung löscht wenn ungleich 0).

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

29.05.2009, 00:21

Zitat von »"Moe"«

Bei VS2k5 ist es definitiv so. Das mit den Datentypen merkt man auf sehr unangenehme Weise mit glUniform, das im Debug Modus mit bool funktioniert, nicht jedoch im Releasemodus (okay, in OGL 3.x habe ich es noch nicht getestet).


Der Compiler kann nicht einfach im Release Mode die Datentypen von Objekten ändern. Ich bin mir sehr sicher dass dieser Fehler mit glUniform() auf irgendeine Form von undefiniertem Verhalten, also einen Programmierfehler zurückzuführen ist...

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

4

29.05.2009, 00:39

Zitat von »"dot"«

Der Compiler kann nicht einfach im Release Mode die Datentypen von Objekten ändern.

Aber irgendetwas passt in diesem Fall nicht, weil ich mir bis heute sicher bin, dass der Code gestimmt hat - mit einem Datentypwechsel ohne weitere Änderungen ging es dann.
Das Problem könnte aber daran liegen, dass OpenGL eigentlich eine C Bibliothek ist und kein bool kennt. Es kann also auch an den unterschiedlichen Optimierungen in Debug und Release liegen, dass die Kompatibilität hier zerbricht...

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

29.05.2009, 00:48

Zitat von »"Moe"«

Das Problem könnte aber daran liegen, dass OpenGL eigentlich eine C Bibliothek ist und kein bool kennt. Es kann also auch an den unterschiedlichen Optimierungen in Debug und Release liegen, dass die Kompatibilität hier zerbricht...


Denk ich eher nicht. Der C++ Compiler kennt ja bool und es gibt keine glUniform() Variante die einen bool nimmt. Folgedessen wird sich der Compiler der int Variante bedienen und den bool in einen solchen promoten. Imo dürfte es da keine Probleme geben...

Wenn du ihn noch hast würd ich gern einen Blick auf den Code der zu diesem Problem führt werfen. Einfach weils mich selber interessiert ;)

EDIT: Hab das mal vom andren Thread getrennt damits dort nicht zu sehr OT wird...

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

6

29.05.2009, 18:17

So, ich musste ein wenig in altem Code wühlen, weil ich es ja entfernt hatte. Im Prinzip läuft es aber auf das hier hinaus:

C-/C++-Quelltext

1
2
3
const bool constant = false;
GLint location = glGetUniformLocation(prog, "inbool");
glUniform1iv(location, 1, (int *) &constant);


Im Shader ganz einfach ein

Quellcode

1
uniform bool inbool;


Jetzt im Nachhinein würde ich sagen, dass es nicht ging wegen dem Type-cast über Zeiger, aber dann hätte es in beiden Fällen nicht gehen dürfen...

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

29.05.2009, 18:59

Zitat von »"Moe"«

Jetzt im Nachhinein würde ich sagen, dass es nicht ging wegen dem Type-cast über Zeiger, aber dann hätte es in beiden Fällen nicht gehen dürfen...


Ganz genau, der cast is komplett undefiniert. Nicht nur dass du einen bool* in einen int* castest, du castest auch noch das const weg.
Sowas muss früher oder später zwangsweise mal explodieren ;)

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

8

01.06.2009, 17:10

Das const wegcasten ist ja nicht so dramatisch, insbesondere, weil es ja nur gelesen wird.
Was ich aber noch immer nicht verstehe, ist, dass es in Debug Modus funktioniert hat, der Releasemodus den Wert aber immer auf 0 (bzw. false) gesetzt hat - hier hätten ja eigentlich Zufallswerte, bzw. true, drinstehen müssen.

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

01.06.2009, 18:03

Zitat von »"Moe"«

Das const wegcasten ist ja nicht so dramatisch, insbesondere, weil es ja nur gelesen wird.


Jaein. Das const verleitet den Compiler evtl. zu einigen Optimierungen... Abgesehen davon ist es einfach falsch und gefährlich ;)

Zitat von »"Moe"«

Was ich aber noch immer nicht verstehe, ist, dass es in Debug Modus funktioniert hat, der Releasemodus den Wert aber immer auf 0 (bzw. false) gesetzt hat - hier hätten ja eigentlich Zufallswerte, bzw. true, drinstehen müssen.


Warum Zufallswerte? Du setzt das Ding doch auf false?
Du weist ja nicht wie der Compiler in dem Fall den bool umsetzt. Vielleicht 4 Byte, vielleicht auch nur eines!? Vermutlich im Releasemodus aufgrund einiger Optimierungen anders als im Debugmodus. Deine OpenGL Funktion erwartet aber einen int und der hat im allgemeinen 4 Byte und die Funktion wird also versuchen einen 4 Byte großen int zu lesen und das wird früher oder später zu einem crash führen wenn da was andres liegt. Der cast ist also einfach nur falsch...

Werbeanzeige