30

Link a raison, ton code est faux.
Tu commences par faire un HeapRealloc sur un bloc, ce qui peut invalider le SYM_ENTRY *, puis tu accèdes à sym->handle pour écrire (le résultat de ton HeapRealloc) dans ton SYM_ENTRY *. Ça marchera si et seulement si tu as verrouillé la VAT avec FolderOp préalablement (ce qui assure que le SYM_ENTRY * reste valide). Comme tu ne le fais pas dans ton extrait, ton extrait est faux.

Et je viens de me rendre compte qu'il y a encore un autre bogue: si le HeapRealloc échoue, il retournera 0, mais ton handle restera en mémoire. Résultat: ton fichier aura 0 comme handle, et le bloc du fichier deviendra de la mémoire leakée.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

31

Ah oui merde j'ai oublié un petit bout grin
Bon bah à rajouter le verouillage avant.

Mais Ordivore a dit que ça ne marchait pas "du tout", alors que ce code même si il manque une ligne devrait dans la plupart des cas fonctionner...

Edit : Pour le 2eme bug, normalement je vérifie la mémoire disponible avant toute operation, il y a une autre cause possible pour qu'un HeapRealloc échoue ?
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

32

Vertyos
a écrit : Edit : Pour le 2eme bug, normalement je vérifie la mémoire disponible avant toute operation, il y a une autre cause possible pour qu'un HeapRealloc échoue ?

Oui. Mémoire fragmentée (par des blocs verrouillés) par exemple. Il faut vérifier le résultat du HeapRealloc. "Vérifier la mémoire disponible avant toute opération" n'est pas une solution correcte.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

33

Merde je viens d'aller voir la doc, il y a risque de bug si les variables autours de celle qui doit être "réalloquée" sont tous lockés sad
Je viens de corriger ça, mais vu les difficultées pour placer un fichier sur Ti-Rex je ne sais pas trop quand ça sera mis à jour...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

34

Note that SymAdd adds only an entry in the VAT with an empty handle; it does not allocate any space for the actual variable. To actually create a variable named "example", do the following (assuming that there were no errors in intermediate steps):

HSym hsym = SymAdd (SYMSTR ("example"));
// HeapAlloc must be executed before DerefSym
// because of possible garbage collection.
HANDLE handle = HeapAlloc (100);
MULTI_EXPR *VarPtr = HeapDeref ((DerefSym(hsym))->handle = handle);

Donc, la SYM_ENTRY contient le n° d'un Handle libre?
C'est pour cela que ça marche aussi bien avec un HeapRealloc(SYM_ENTRY.handle) qu'avec un SYM_ENTRY.handle=HeapAllocwhat
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

35

Non. "With an empty handle" veut dire que le champ handle est mis à 0 (H_NULL). Mais HeapRealloc fonctionne parce que:
If Handle is H_NULL, HeapRealloc calls HeapAlloc. Otherwise, ...

(extrait de la documentation de TIGCCLIB. Copyright Zeljko Juric et contributeurs divers, 2000-2003.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

36

oké marci. smile
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.