2008-12-23 7 views
5

J'ai seulement 1 ligne de code, et c'est:Pourquoi ai-je une erreur de saturation de tampon avec cette ligne de code?

pcrecpp::RE re("abc"); 

dans une fonction OnBnClickedButtonGo(). Et cette fonction échoue en mode Release, mais cela fonctionne correctement en mode débogage.

(J'utilise Visual Studio 8 sous Windows XP.)

Le message d'erreur est:

A buffer overrun has occurred in testregex.exe which has corrupted the program's 
internal state. Press Break to debug the program or Continue to terminate 
the program. 
For more details please see Help topic 'How to debug Buffer Overrun Issues'. 

Je pense qu'il est son destructor, qui est invisible et sous-entendus ... mais je ne Je ne sais pas vraiment. PS: Je suis en liaison statique avec la version 7.8 de PCRE lib. PS2: Pas très pertinent, mais peut aider certaines personnes qui ont des problèmes de liaison à la bibliothèque PCRE (cela m'a pris des heures pour le trier): inclure la ligne #define PCRE_STATIC.

+0

Avez-vous construit la bibliothèque, ou était-ce une librairie en conserve? De toute façon, a-t-il été compilé avec le même compilateur? Sinon, je vais essayer de construire la lib avec votre compilateur et voir si cela aide. –

Répondre

0

Si cela se produit uniquement en mode édition, il est possible que quelque chose soit "optimisé". Essayez de faire quelque chose de plus que le seul paquebot, comme un match() et peut-être même imprimer les matches.

3

J'ai eu le même message d'erreur dans mon cas. Dans le débogage tout va bien, mais dans la version, je reçois le message d'erreur. J'ai une bibliothèque C/C++ native comme native.dll. J'ai créé une bibliothèque C++ mixte non gérée/gérée, qui est un wrapper pour cette bibliothèque à .net. Quelque part dans ce mixed.dll J'ai une déclaration de signature de la fonction non gérée, comme:

typedef void (*FunctionOnStartSend)(); 

pour cela le je reçois le message, mais si j'ajoute un « mot magique » il alors il n'y a pas de message d'erreur:

typedef void (__stdcall *FunctionOnStartSend)(); 
+0

Brillante réponse, mec! – LmTinyToon

0

Voici mon histoire fraîche: ya environ un mois, j'ai un échec de lien étrange du VS2008 et ce jour-là, je creusais que la mise _SECURE_SCL = 0 peut aider (voir link text). Et ça a aidé. Ce jour-là, ça m'a aidé et j'ai juste propagé ce paramètre à toutes les libs que nous avons construites en équipe - c'est parce que MS dit que deux libs construites avec des _SECURE_SCL différents sont incomparables.

Le temps a passé et il ya trois jours j'ai un bug quand VS2008 dit que le message d'erreur que nous voyons dans le premier message. Et il n'y a pas d'aide du débogueur car il ne dépasse que dans la version Release. J'ai passé près de 2 jours à pump'n'jump'n le code des libs et le dépassement était imparfait d'une ligne à l'autre. Enfin, j'ai commencé à vérifier les paramètres de construction ligne par ligne et j'ai trouvé la différence dans ce réglage! Pourquoi, oh pourquoi les gars de Microsoft ne peuvent pas incorporer un petit code de chargement dynamique pour vérifier que la bibliothèque en cours d'exécution et celle qui va être chargée dynamiquement sont incomparable?! Quelques pièces de code qui font gagner du temps aux gens. Blabla!

Questions connexes