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?


Log in to reply