Mystèrieux bugs dans le compilateur VB6...

Publié 25 avril 06 10:29 | warning 

Dans le cadre du développement de mon décompilateur pour Visual Basic j'ai rencontré quelques limitations assez étonnantes du casting implicit de Visual Basic 6.0. 

Je vous présente donc un morceau de code qui me posais problème et que j'ai pu reproduire. Mon problème est qu'à l'éxecution, sous l'IDE de Visual Basic 6.0 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:

1
2
3
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 appropriées. Même pas! Le compilateur a directement 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é.

Sylvain Bruyere

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# Poppyto said on avril 25, 2006 23:53:
>> Dim ClassLenght As Long
>> classlenght = -2147483599 - &H80000000

Il doit y avoir un cast ou une bêtise de ce genre qui fait que tu retrouves tes petits ;) (unsigned ?)
# warning said on avril 25, 2006 23:57:
Solution trouvée:

Dim ClassLenght As Long
classlenght = -2147483599
classlenght = classlenght And &H7fffffff
là ça marche, mais j'ignore toujours pourquoi l'autre ne fonctionne pas.
# Taron said on avril 26, 2006 10:44:
Integer overflow nan ?
# warning said on avril 26, 2006 10:48:
Même pas, la aucun integer n'est utilisé... Ce qui m'embête c'est que ce soit le compilo qui fasse directement pointer vers un message d'erreur dans le code.
# Gamanga said on avril 26, 2006 12:08:
si on modifie le code comme suit
Dim ClassLenght As Long
classlenght = 0 '-2147483599 'J'ai mise cette valeur car c'est celle qui apparait lors du bug
classlenght = classlenght - &H80000000
ça plante en débugging

et comme cela
Dim ClassLenght 'As Long
classlenght = 0 '-2147483599 'J'ai mise cette valeur car c'est celle qui apparait lors du bug
classlenght = classlenght - &H80000000
ca marche et le résultat est endehors de la portée du type Long.
Il faut réfléchir à la façon dont VBµ6 exécute les calculs intermédiaires en mode Débugging et en mode optimisé où il n'y aura pas de conversion de type et -&h8000000 n'est pas un long.

Dans le même ordre d'idée mais au niveau structure
en mode débug ceci fonctionne
with a
exit sub
end with

En mode autonome (dans un exe) même pas optimisé ça plante.
# warning said on avril 26, 2006 12:16:
C'est bon a savoir merci :)

Par contre
with a
exit sub
end with

ça ne plante pas une fois compilé chez moi... étrange.
# EBArtSoft said on avril 26, 2006 21:11:
Ce n'est pas un bug, tu trouvera la reponse dans le code compilé. Utilise l'addin vbasm (par ex) pour extraire le listing assembleur.

Cela vient du test sur les entiers que realise vb avant toute operation. Jete un coup d'oeil tu comprendras il fait plusieurs test avant de renvoyer le resulat. Pour ce qui est de la solution il te suffit de cocher l'option de compilation "supprimer les controles sur le depassement des entiers" et tu verras ça marche.

Et puis je t'aiq deja dit : quand tu sais pas un truc sur vb... tu me demandes ! lol ;)

@+
# warning said on avril 26, 2006 22:00:
lol t'étais pas connecté bougre! ;)
Les contrôles sur les dépassements des entiers ça vérifie pendant la compilation ou a l'execution?
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01