2008-12-23 7 views
5

Ich habe nur 1 Zeile Code, und das ist:Warum erhalte ich einen Pufferüberlauffehler mit dieser Codezeile?

pcrecpp::RE re("abc"); 

innerhalb einer Funktion OnBnClickedButtonGo(). Und diese Funktion schlägt im Freigabemodus fehl, funktioniert aber im Debug-Modus.

(I Visual Studio 8 unter Windows XP verwenden.)

Die Fehlermeldung lautet:

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'. 

Ich vermute, dass es seinen destructor ist, die unsichtbar und implizierte ist ... aber ich don Ich weiß es wirklich nicht.

PS: Ich bin statisch mit der PCRE-Bibliothek Version 7.8 verbunden. PS2: Nicht sehr relevant, kann aber einigen Leuten helfen, die Probleme beim Verlinken mit der PCRE-Bibliothek haben (es hat mich Stunden gekostet, das Problem zu lösen): füge die Zeile #define PCRE_STATIC hinzu.

+0

Haben Sie die Bibliothek erstellt, oder war es eine gespeicherte Bibliothek? Wie auch immer, wurde es mit dem gleichen Compiler kompiliert? Wenn nicht, würde ich versuchen, die lib mit Ihrem Compiler zu erstellen und sehen, ob das hilft. –

Antwort

0

Wenn es nur im Freigabemodus passiert, ist es möglich, dass etwas "optimiert" wird. Versuche etwas mehr als nur den einen Liner, wie ein Match() und vielleicht sogar die Matches auszudrucken.

3

Ich hatte die gleiche Fehlermeldung in meinem Fall. Im Debug ist alles in Ordnung, aber in Release bekomme ich die Fehlermeldung. Ich habe eine native C/C++ - Bibliothek wie native.dll. Ich habe eine gemischte nicht verwaltete/verwaltete C++ - Bibliothek erstellt, bei der es sich um einen Wrapper für diese Bibliothek für .net handelt. Irgendwo in diesen mixed.dll Ich habe eine nicht verwaltete Funktion Unterschrift Erklärung, wie:

typedef void (*FunctionOnStartSend)(); 

hierfür die ich die Nachricht bekommen, aber wenn ich ein „Zauberwort“ dort hinzufügen, dann gibt es keine Fehlermeldung:

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

Brillante Antwort, Mann! – LmTinyToon

0

ist meine neue Geschichte: vor etwa einem Monat ich einen seltsamen Link Scheitern der VS2008 habe und an diesem Tag grub ich diese Einstellung _SECURE_SCL = 0 helfen kann (siehe link text). Und es hat geholfen. An diesem Tag hat es mir geholfen, und ich habe diese Einstellung nur an alle libs weitergegeben, die wir im Team erstellen - weil MS sagt, dass zwei Bibliotheken, die mit verschiedenen _SECURE_SCL erstellt wurden, nicht kompatibel sind.

Die Zeit verging und vor drei Tagen habe ich einen Fehler, wenn VS2008 sagt, dass Fehlermeldung, die wir im ersten Post sehen. Und es gibt keine Hilfe vom Debugger, da es nur in Release-Build überläuft. Ich habe fast 2 Tage pump'n'jump'n der Code der libs und der Überlauf war von Zeile zu Zeile fehlerhaft. Schließlich habe ich begonnen, die Build-Einstellungen Zeile für Zeile zu überprüfen und das Diff in dieser Einstellung zu berechnen!

Warum, oh, warum Microsoft Jungs können nicht einige kleine Check-in dynamischen Ladeprogramm Code einbetten, um zu testen, dass die Bibliothek derzeit ausgeführt wird und die eine dynamisch geladen wird inkompatible?! Irgendein Stück Code, der die Zeit der Leute spart. Blah!