Buffer Overflow
-
Martin Richter schrieb:
Da musst Du schon etwas mehr Code zeigen.
buffer = "10" weißt keinen String zu sondern setzt einen Pointer!Ich wollte damit nur sagen das der Wert von buffer zu dem Zeitpunkt den String "10" enthält.
Matthias
-
Das sagt nur, das buffer einen Zeiger auf einen konstanten String mit dem Text "10" enthält.
-
Hier etwas mehr Quellcode:
CDlgPPM::CDlgPPM(CWnd* pParent /*=NULL*/) : CDialog(CDlgPPM::IDD, pParent) , m_WndRadioColor(0) { m_ShowOutputEvery = 10; } BOOL CDlgPPM::OnInitDialog() { CDialog::OnInitDialog(); CString buffer; buffer.Format("%d",m_ShowOutputEvery); m_WndEditShowIterations.SetWindowText (buffer); ...in dieser Funktion aus einem Dialog stürzt das Programm in der letzten Zeile ab.
Allerdings passiert das auf meinem Bürorechner nicht, sondern nur auf meinem Laptop und meinem Laborrechner (auf andern bislang nicht getestet).
Kompiliert habe ich immer mit STR+ALT+F7.Falls noch mehr Code benötigt wird bitte sagen welcher Ausschnitt.
Matthias
-
Die Funktion m_WndEditShowIterations.SetWindowText (buffer); greift nicht schreibend auf den Speicher zu!
Was sagt der Callstack?
SetWindowText hat nicht mal etwas mit Deiner datei inatldebugapi zu tun! Woher kommt diese?Kann es sein, dass schon vorher der Stack manipuliert wird?
-
Martin Richter schrieb:
Die Funktion m_WndEditShowIterations.SetWindowText (buffer); greift nicht schreibend auf den Speicher zu!
Was sagt der Callstack?
Wie bekomme ich den ? Meinst du vieleicht die 'Ausgabe'
"LightModulator2D.exe": "Z:\Cpp\Hibiscus\LightModulator2DMat\debug\LightModulator2D.exe" geladen, Symbole wurden geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\ntdll.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\kernel32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugMFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_257740a4\mfc80d.dll" geladen, Symbole wurden geladen.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcr80d.dll" geladen, Symbole wurden geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\msvcrt.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\gdi32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\user32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\shlwapi.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\advapi32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\rpcrt4.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\comctl32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\oleaut32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\ole32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f\msvcp80d.dll" geladen, Symbole wurden geladen.
"LightModulator2D.exe": "Z:\Cpp\Hibiscus\LightModulator2DMat\LightModulator2D\libfftw3-3.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"LightModulator2D.exe": "C:\WINDOWS\system32\imm32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.MFCLOC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_91481303\mfc80DEU.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"LightModulator2D.exe": "C:\WINDOWS\system32\uxtheme.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\MSCTF.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\Programme\ScanSoft\OmniPageSE2.0\OpHookSE2.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"LightModulator2D.exe": "C:\WINDOWS\system32\version.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\Programme\Logitech\SetPoint\lgscroll.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcr80.dll" geladen, Symbole wurden geladen.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\msvcp80.dll" geladen, Symbole wurden geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\ntmarta.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\wldap32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\samlib.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\shell32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\MSCTFIME.IME" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\Programme\Tronan\RSI-Shield\InputInterceptorSvr.dll" geladen, Keine Symbole geladen.
"LightModulator2D.exe": "C:\WINDOWS\system32\winmm.dll" geladen, Keine Symbole geladen.
Warning: no message line prompt for ID 0x8004.
Warning: skipping non-radio button in group.
Warning: skipping non-radio button in group.bis zu dem Punkt wo der Fehler auftritt.
Martin Richter schrieb:
SetWindowText hat nicht mal etwas mit Deiner datei inatldebugapi zu tun! Woher kommt diese?
Schreibfehler von mir, es heißt 'atldebugapi' und die ist von Microsoft.
Martin Richter schrieb:
Kann es sein, dass schon vorher der Stack manipuliert wird?
Außer das ich Variablen der Dialogklasse Werte zuweise passiert bis dahin nichts.
CDlgPPM::CDlgPPM(CWnd* pParent /*=NULL*/) : CDialog(CDlgPPM::IDD, pParent) , m_WndRadioColor(0) { UpdateGraphics=true; ColorScale=0; PlotSize.x=128; PlotSize.y=128; PlotDataSize.x=128; PlotDataSize.y=128; m_DOESize.x=20e-3; // 2 cm m_DOESize.y=20e-3; // 2 cm m_ShowOutputEvery = 10; }(inkonsistente Verwendung von m_Variable für die Member... es sind alles Member der Klasse)
Matthias
-
Schau dir mal diesen Artikel an, vielleicht hilft's

Ansonsten:
Nein, das ist nicht der Call-Stack, das sind die TRACE-Ausgaben des Programms. Und abgesehen von den drei Warnungen am Ende sieht das unauffällig aus (da solltest du dir mal den Dialog im Ressourcen-Editor ansehen, scheint ein paar falsche Zuordnungen zu geben).Außerdem sehe ich nirgends, daß m_WndEditShowIterations initialisiert wurde.
-
CStoll schrieb:
Schau dir mal diesen Artikel an, vielleicht hilft's

Ah, es heißt Aufrufliste, das wäre dann das hier:
> LightModulator2D.exe!CDlgPPM::OnInitDialog() Zeile 113 C++
mfc80d.dll!AfxDlgProc(HWND__ * hWnd=0x000621f6, unsigned int message=272, unsigned int __formal=401912, unsigned int __formal=401912) Zeile 28 + 0x10 Bytes C++
user32.dll!7e368734()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für user32.dll]
...Außerdem sehe ich nirgends, daß m_WndEditShowIterations initialisiert wurde.
?? Das ist eine Variable die zur Klasse gehört. Damit wird sie automatisch initialisiert dachte ich. Sonst müsstest du mir erklären welchen Code du vermisst.
Matthias
-
Hier jetzt die Aurufliste von einem der Computer wo der identische Quellcode zum abstürzen führt:
> mfc80d.dll!AtlTraceVA(unsigned long dwModule=1, const char * pszFileName=0x781e0abc, int nLine=377, unsigned long dwCategory=4, unsigned int nLevel=1, const char * pszFormat=0x781e0b58, char * ptr=0x00033458) Zeile 342 C++
mfc80d.dll!ATL::CTrace::TraceV(const char * pszFileName=0x781e0abc, int nLine=377, unsigned long dwCategory=4, unsigned int nLevel=1, const char * pszFmt=0x781e0b58, char * args=0x00033458) Zeile 148 + 0x24 Bytes C++
mfc80d.dll!ATL::CTraceFileAndLineInfo::operator()(unsigned long dwCategory=4, unsigned int nLevel=1, const char * pszFmt=0x781e0b58, ...) Zeile 170 + 0x27 Bytes C++
mfc80d.dll!CCmdTarget::OnCmdMsg(unsigned int nID=1039, int nCode=768, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 377 + 0x41 Bytes C++
mfc80d.dll!CDialog::OnCmdMsg(unsigned int nID=1039, int nCode=768, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 85 + 0x18 Bytes C++
mfc80d.dll!CWnd::OnCommand(unsigned int wParam=50332687, long lParam=66798) Zeile 2300 C++
mfc80d.dll!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=50332687, long lParam=66798, long * pResult=0x00033698) Zeile 1755 + 0x1e Bytes C++
mfc80d.dll!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=50332687, long lParam=66798) Zeile 1741 + 0x20 Bytes C++
mfc80d.dll!AfxCallWndProc(CWnd * pWnd=0x0012eb08, HWND__ * hWnd=0x0002045a, unsigned int nMsg=273, unsigned int wParam=50332687, long lParam=66798) Zeile 240 + 0x1c Bytes C++
mfc80d.dll!AfxWndProc(HWND__ * hWnd=0x0002045a, unsigned int nMsg=273, unsigned int wParam=50332687, long lParam=66798) Zeile 389 C++
mfc80d.dll!AfxWndProcBase(HWND__ * hWnd=0x0002045a, unsigned int nMsg=273, unsigned int wParam=50332687, long lParam=66798) Zeile 411 + 0x15 Bytes C++
user32.dll!7e368734()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für user32.dll]
...Ich hoffe eine von euch kann daraus etwas brauchbares lesen und mir weiterhelfen.
Matthias
-
Du bekommst hier bei einer Trace Ausgabe einen Crash!
Das ganze hängt mit einer WM_COMMAND Nachricht des Controls mit der ID 1039 zusammen (siehe resource.h).
Der Notification Code ist 0x300, das könnte z.B. EN_CHANGE, oder ein anderer WM_COMMAND Code sein, je nachdem was das für ein Control ist.Das ist eigentümlich.
Verwende doch mal Remote Debugging umn dem Problem näher zu kommen.
Du benötigst nur die Remote Debug Komponenten auf dem Ziel Rechner. Dann kannst Du über das Netzwerk Dich auf den entsprechenden Prozess verbinden und normal debuggen.
-
Martin Richter schrieb:
Du bekommst hier bei einer Trace Ausgabe einen Crash!
Das ganze hängt mit einer WM_COMMAND Nachricht des Controls mit der ID 1039 zusammen (siehe resource.h).
Der Notification Code ist 0x300, das könnte z.B. EN_CHANGE, oder ein anderer WM_COMMAND Code sein, je nachdem was das für ein Control ist.Das ist das Control das zu m_WndEditShowIterations gehört, also da wo das Programm abstürzt.
Martin Richter schrieb:
Verwende doch mal Remote Debugging umn dem Problem näher zu kommen.
Du benötigst nur die Remote Debug Komponenten auf dem Ziel Rechner. Dann kannst Du über das Netzwerk Dich auf den entsprechenden Prozess verbinden und normal debuggen.Mal abgesehen davon das ich mir noch anschauen muss was damit eigentlich gemeint ist, verstehe ich nicht was mir das bringt. Schließlich habe ich die Entwicklungsumgebung doch auf dem Rechner wo das abstürzt.
Kannst du mir dazu mehr sagen/erklären ?
Matthias
-
Fehler gefunden:
void CDlgPPM::OnEnChangeEditShowIter() { CString CstrText; m_WndEditShowIterations.GetWindowText (CstrText); ... CstrText.Format("%d",istrValue); m_WndEditShowIterations.SetWindowText (CstrText); }daher kommt die Rekursion und der Stacküberlauf.
Es wundert mich nur, da ich dachte, dass MFC solche Rekursionen von sich aus abfängt.
Matthias
-
OK Ich dachte es wäre ein anderer Rechner, der betroffen war.
Die MFC fängt solche Rekursionen nur ab, wenn DoDataExchange verwendet wird!
Zudem:
1. Woher soll die MFC wissen, wer wann wie welches Control ändert und wer aus welchen Gründen in den tiefsten Tiefen dann eine Änderungsnachricht erhält.
2. In bestimmten Fällen sind solche Rekursionen gewünscht.Mal ganz abgesehen davon. Dein Code wird den Nutzer aber ganz schon ärgern. Er tippt eine Zahl und was ganz anderes erscheint...
Macht das Sinn?Ich würde eine Validierung immer erst machen, wenn der User das Feld verlässt. Aber das ist Geschmackssache.
-
Martin Richter schrieb:
Mal ganz abgesehen davon. Dein Code wird den Nutzer aber ganz schon ärgern. Er tippt eine Zahl und was ganz anderes erscheint...
Macht das Sinn?Ich würde eine Validierung immer erst machen, wenn der User das Feld verlässt. Aber das ist Geschmackssache.
Guter Vorschlag - den sollte man auch einigen größeren Entwicklern geben

(ich hatte mal sowas bei einem Grafikprogramm - man konnte den Gamma-Wert im Bereich 0.1 .. 7 einstellen, aber bei jedem Tastendruck wurd überprüft, ob ein legaler Wert angegeben war)