Access violation - Wo im code?
-
Hallo,
mein Debugger zeigt mir eine Access Violation an, die laut Call Stack in folgender Funktion auftreten soll:
GetPathFromJobIni(int i, BOOL bGetFromDone) { char * cBuffer; // Buffer to recieve the path cBuffer = new char[MAX_PATH]; char cI[6]; sprintf(cI, "%d", i); LPSTR szIniFile; // Set job file path to either done or current if(bGetFromDone) { szIniFile= this->szIniDone; } else { szIniFile= this->szIniJobs; } // Get job's filename from jobs file GetPrivateProfileString(cI, this->szPathKeyName, "", cBuffer, MAX_PATH, szIniFile); // Return the job's filename return cBuffer; }
Erkennt jemand, wo das Speichermanagement problematisch sein könnte? Wäre super!
Grüße
veryxRV
-
sprintf(cI, "%d", i);
-
Danke Warum genau?
-
Der Buffer cI ist mit 6 Bytes zu klein.
-
Wieviel sollte er denn haben? Da passen doch 5 oder 6 characters rein... oder nicht? Der integer, der mit sprintf in den string geschrieben werden soll, hat niemals mehr als 4 stellen, bei meinen Tests sogar meistens nur eine.
-
ich werd nie, nie, nie, nie und nimmer verstehen was ihr noobs bloß alle gegen std::string (oder gerne auch vector) habt. dummes, unsicheres rumgefuchtel mit prähistorischen char-arrays, explizite speicherallokation und -freigabe (wobei letzters ja meistens sowieso einfach weggelassen wird) und buffer overflows via sprintf und konsorten müssen anscheinend unglaublich viel spaß machen.
veryxRV schrieb:
Der integer, der mit sprintf in den string geschrieben werden soll, hat niemals mehr als 4 stellen
tz. berühmte letzte worte.
-
Das da oben könnte C code sein. C99 mit eier globalen variable names this.
-
ohne schuh schrieb:
ich werd nie, nie, nie, nie und nimmer verstehen was ihr noobs bloß alle gegen std::string (oder gerne auch vector) habt. dummes, unsicheres rumgefuchtel mit prähistorischen char-arrays, explizite speicherallokation und -freigabe (wobei letzters ja meistens sowieso einfach weggelassen wird) und buffer overflows via sprintf und konsorten müssen anscheinend unglaublich viel spaß machen.
veryxRV schrieb:
Der integer, der mit sprintf in den string geschrieben werden soll, hat niemals mehr als 4 stellen
tz. berühmte letzte worte.
-
Alles schön und gut, wie wäre es mit einer Antwort auf meine Frage?
-
veryxRV schrieb:
wie wäre es mit einer Antwort auf meine Frage?
Wie wäre es mit mehr Informationen? Wie lautet der genaue Text der AV? Wo genau tritt die AV auf? Welche Werte haben die beteiligten Zeiger?
-
... und was ist "this->szPathKeyName" !?
-
Adresse:
7724715c 66894cc604 mov word ptr [esi+eax*8+4],cx ds:0023:01a318e4=????
Debugger Ausgabe:
(1560.135c): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=00004100 ebx=003b0000 ecx=00003496 edx=00000002 esi=01a110e0 edi=01a110e0 eip=7724715c esp=0012f8e0 ebp=0012f908 iopl=0 nv up ei pl nz na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206 ntdll!RtlDetermineDosPathNameType_U+0x721: 7724715c 66894cc604 mov word ptr [esi+eax*8+4],cx ds:0023:01a318e4=????
Das ganze habe ich mit WinDbg debugged (Windows Debugging Tools).
-
Alles schön und gut, wie wäre es mit Antworten auf Jochens und meine Fragen?
veryxRV schrieb:
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.Hast du das gelesen und verstanden?