J'ai du mal à comprendre cela .. donc le temps de demander de l'aide.Qu'est-ce que cela pourrait être? [bug de programme]
OS: Mac OS X, Snow Leopard gcc
: version Xcode de gcc, 4.2.1
Bibliothèque: gmp, gmpxx
Problème: une fonction se bloque à droite à la fin avec:
flx_run(94749) malloc: *** error for object 0x7fff706d1500: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Program received signal SIGABRT, Aborted.
0x00007fff835cd886 in __kill()
(gdb) bt
#0 0x00007fff835cd886 in __kill()
#1 0x00007fff8366deae in abort()
#2 0x00007fff83585a75 in free()
#3 0x00000001000bca45 in flxusr::gmp__hyphen_0::_init_()
Previous frame inner to this frame (gdb could not unwind past this frame)
Je ne demande pas libre() dans la fonction initialisation, et la fonction ne fonctionne correctement jusqu'à la boucle de fermeture accolade y .. donc le point de chute doit être dans les Destructeurs des objets locaux (à droite?)
La chose drôle est:
a) Le programme (semble) fonctionne très bien si elle est liée de manière statique, il ne échoue si le code est construit dans un fichier * .dylib et chargé dynamiquement. B) le programme échoue de la même manière avec deux versions complètement différentes de gmp/gmpxx. [4.3 ou quelque chose et 5.01]
c) les versions de liaison statiques et dynamiques fonctionnent très bien sur Ubuntu 10.5 LTS
Le code est généré par mon compilateur, il est pas le code écrit à la main. Le code utilisateur est exécuté par un programme de pilote de niveau supérieur. Le système exécute plusieurs centaines de tests de régression avec succès. Cependant, le code écrit à la main suivant est utilisé dans ce cas de test particulier:
namespace flx { namespace gmp {
string flx_mpf_get_str(mpf_class const &a)
{
mp_exp_t x;
std::string s = a.get_str(x,10,0);
char b[100];
std::snprintf(b,100,"e%ld",(long)x);
return std::string(".")+s+b;
}
}}
mais cela me semble bien. Le cadre de pile de la fonction contient plusieurs objets mpz_class, mpq_class et mpf_class. En dehors des bugs dans gmp/gmpxx, la seule autre chose que je peux penser est que mon système d'exécution ou le code généré corrompent la mémoire. L'adresse étant "libérée" qui n'a pas été allouée est suspecte (c'est loin d'être le tas). J'ai construit une version de gmp avec l'option -g mais je n'ai plus d'informations (ce qui suggère que ce n'est pas une mauvaise chose à l'intérieur d'un destructeur de classe gmpxx).
J'ai besoin d'idées! Je n'ai aucune idée d'où regarder maintenant. Thx à l'avance :)
Lien vers la source
http://felix-lang.org:1116/ $/home/skaller/felix/felix/build/release optimisé/test/gmp/gmp-0.cpp
Meta: SO de démarque ne fonctionne pas! Donc vous devrez copier à la main.
pourrait tout aussi bien jeter le lien vers le code Felix car il est un peu plus lisible et a des choses amusantes dans ce (comme la syntaxe définie par l'utilisateur et si vous allez à la bibliothèque, vous pouvez voir classes de types instancié)
http://felix-lang.org:1116/ $/home/skaller/felix/felix/build/version-optimisée/test/gmp/gmp-0.flx
gmp src de 5.01 de gnu, et oui, c'est 64 bits AFAIK. – Yttrill
Juste à noter: Je ne veux pas spécifiquement le code 32 bits. Si j'avais mon chemin, je l'interdirais complètement de mon système. Peut être fait sur Linux mais pas si facile sur un Mac. – Yttrill