Mystérieux bug du compilo

Résolu
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 - 25 avril 2006 à 21:55
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 - 26 avril 2006 à 02:53
Salut à tous! Je vous présente un bout de code d'un bug que j'ai pu reproduire (ça m'a pris du temps avant de le trouver). Mon problème c'est qu'a l'execution sous l'IDE VB6 tout marche parfaitement, mais une fois compilé (mode optimisation de la rapidité d'execution)... c'est autre chose. Comment trouver un bug qui n'apparait qu'a la compilation alors que tout se passe bien lors du débogage sous l'IDE ? A vrai dire j'ai mis la journée a trouver d'ou venait le problème donc si vous avez des idées (a savoir que j'avais quand même Numega Smartcheck sous la main que je conseil d'ailleurs à tous le monde).

Voici le bout de code mystère que j'ai pu reproduire:

Dim ClassLenght As Long
classlenght = -2147483599 'J'ai mise cette valeur car c'est celle qui apparait lors du bug
classlenght = classlenght - &H80000000

Essayer le d'abord sous l'IDE en debugage puis directement en executable après compilation (mode optimisation de la rapidité).
Le message suivant apparait: Dépassement de capacité.
Je désassemble pour comprendre en me disant qu'en optimisant VB à peut être mal fait son travail en n'utilisant pas des instructions assembleurs. Même pas! Le compilateur a carrement interprété le code VB comme érroné et le code pointe directement sur un message d'erreur.

Bizarrement ça ça passe:
Dim ClassLenght
As Long

classlenght = -2147483599 - &H80000000

Si quelqu'un à la solution à ce problème, ou une explication du pourquoi de la chose je suis interessé.

@ Bientôt pour de nouvelles aventures au coeurs de VB6!

Sylvain

Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/

5 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
26 avril 2006 à 00:33
Salut,

le nombre MsgBox &H80000000 est un peu particulier car il n'a pas d'équivallent en valeur positive.





MsgBox &H80000000 et MsgBox -(&H80000000)

donnent la même chose, le moins n'est pas pris en compte.



par contre MsgBox 0 - &H80000000 provoque un OverFlow.



une autre valeur différente MsgBox &H80000001 ne provoque plus l'erreur.



d'autre part:

Dim
ClassLenght As Double

classlenght = classlenght - &H80000000

ne provoque plus l'erreur !!!!!



et aussi:

Dim
ClassLenght As Long

classlenght = classlenght - CDbl(&H80000000)

ne provoque plus l'erreur !!!!!



l'optimization Remove Integer OverFlow Cheks:

supprime l'erreur (chez moi en tous cas)



conclusions:

- le calcul se fait différemment en IDE et après la compile

- l'erreur provient de cette valeur &H80000000

- j'ai l'impression que dans le calcul,

c'est la valeur positive qui est d'abord calculée

et comme ça tient pas dans un Long --> erreur

par contre ça passe dans un Double.


Daniel
3
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
26 avril 2006 à 01:21
Une solution dans ce cas très particulier:
classlenght = classlenght And &h7EEEEEEE


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
26 avril 2006 à 01:59
si c'est pour enlever le signe, celle là est valable:

ClassLenght = -2147483599

ClassLenght = ClassLenght And &H7FFFFFFF

MsgBox ClassLenght



celle là ne passera pas si ClassLenght est >= 0

ClassLenght = -2147483599

ClassLenght = &H7FFFFFFF + ClassLenght + 1

MsgBox ClassLenght



et celle ci ne pas à la compile:

ClassLenght = -2147483599

ClassLenght = &H7FFFFFFF - Not ClassLenght

MsgBox ClassLenght



Daniel
3
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
26 avril 2006 à 01:27
Salut Gobillot et merci pour ton intervention. Effectivement &h80000000 est un nombre particulier car il affecte directement le signe. Malgrès tout c'est dommage que le debogeur ne se comporte pas comme l'exe.
L'utilisation de CDbl est limité si l'on veux un code optimisé tout comme l'utilisation de Val() que m'a conseillé Jack que je remercie également pour son aide.

Bonne soirée & bon coding


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Warning Messages postés 516 Date d'inscription samedi 3 février 2001 Statut Membre Dernière intervention 24 octobre 2006 2
26 avril 2006 à 02:53
Ouups oui t'a raison je voulais mettre classlenght = classlenght And &h7FFFFFFF et non pas classlenght = classlenght And &h7EEEEEEE.

Merci


Warning
Admin Codes-Sources.com
http://www.decompiler-vb.net/
0
Rejoignez-nous