Bug : crash lors de la sauvegarde d'un shader
Reproduction du bug :
Sur plusieurs systèmes, lorsque j'effectue une modification à un shader pendant l'exécution du programme (que la modification soit du code valide ou non) de temps en temps le programme segfault. 0xc0000005 (Access Violation sur windows). Après avoir attaché un debugger il s'agirait d'un déréférencement de pointeur nul dans GL4Dummies.dll
C:\Users\amsi\Documents\work\fromGIT\GL4Dummies\lib_src\GL4D\gl4dummies.c:92:In FUNC: une erreur s'est produite lors de la lecture du fichier shaders/main.gs
ProjetDemoGL4D.exe (processus 6828) s'est terminé avec le code -1073741819 (0xc0000005).
Piste de résolution
Vérifier que le fichier est bien accessible avant de vérifier sa dernière date de modification et sa lecture potentielle.
ça ne semble pas être un problème d'accès à la date de modification, l'erreur est consécutive au print de la ligne 92 (dans gl4dummies.c) donc après avoir récupéré les infos sur le fichier, c'est le fread qui échoue mais l'erreur est bien récupérée.
Le problème se propage peut-être plus loin, le NULL renvoyé par gl4dReadTextFile est probablement mal géré dans gl4duUpdateShaders (gl4du.c) vers la ligne 689 ou 700
L'idéal est de recompiler la dll sous windows en mode debug, et de tracer un peu plus finement avant de faire des modifications.
Bonjour, j'ai recompilé GL4Dummies.dll avec les information de debug et donc voici la trace d'exécution du programme lorsque ce bug se produit (parfois à l'enregistrement du fichier shader)
Je propose donc de rajouter cette vérif dans la fonction gl4duUpdateShaders() puis ce que selon la spécification la fonction peut retourner 0 si il n'y a pas eu de mise à jour :
ptr = addInShadersList(ot, fn, NULL);
if (!ptr)
return 0;
oui la solution semble convenir mais il serait peut-être intéressant de se mettre (au moins le temps d'un 1/20 de seconde) dans une boucle (avec du usleep ou du SDL_Delay) qui attendrait que le fichier soit à nouveau readable ... si à l'issu du petit délai rien ne change on renverait zéro.