Mystérieux bug du compilo [Résolu]

cs_Warning 517 Messages postés samedi 3 février 2001Date d'inscription 24 octobre 2006 Dernière intervention - 25 avril 2006 à 21:55 - Dernière réponse : cs_Warning 517 Messages postés samedi 3 février 2001Date d'inscription 24 octobre 2006 Dernière intervention
- 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/
Afficher la suite 

5 réponses

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 26 avril 2006 à 00:33
3
Merci
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

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Meilleure réponse
cs_Warning 517 Messages postés samedi 3 février 2001Date d'inscription 24 octobre 2006 Dernière intervention - 26 avril 2006 à 01:21
3
Merci
Une solution dans ce cas très particulier:
classlenght = classlenght And &h7EEEEEEE


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

Merci cs_Warning 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 26 avril 2006 à 01:59
3
Merci
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

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 84 internautes ce mois-ci

cs_Warning 517 Messages postés samedi 3 février 2001Date d'inscription 24 octobre 2006 Dernière intervention - 26 avril 2006 à 01:27
0
Merci
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/
cs_Warning 517 Messages postés samedi 3 février 2001Date d'inscription 24 octobre 2006 Dernière intervention - 26 avril 2006 à 02:53
0
Merci
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/

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.