strcpy_s zerstört stack

Klaus1311

Grünschnabel
Hallo,

ich habe mit Visual Studio 2008 ein Problem mit dem Aufruf strcpy_s. Der einfachheithalber habe ich den Code minimiert. Vielleicht kann mir jemand sagen was ich falsch mache.

Das projekt ist eine win32 Konsolenanwendung. Die Compiler Einstellungen sind Standard mit Ausnahme des Parameters Zeichensatz, den habe ich auf "Multi-Byte-Zeichensatz verwenden" geändert.
Beim Verlassen der Funktion void put_old_file_to_history() kommt die Fehlermeldung "Run-Time Check Failure #2 - Stack around the variable 'hist' was corrupted."

Hier ist der Code:


#include "stdafx.h"
#include "string.h"


void put_old_file_to_history();


int _tmain(int argc, _TCHAR* argv[])
{

put_old_file_to_history();
return 0;
}



void put_old_file_to_history()
{
TCHAR path[260+1];
TCHAR path_new[260+1];
TCHAR hist[128+1];
int len;

strcpy_s(path,260,_T("11111111112222222222333"));
len = (int)strlen(path);
strcpy_s(path_new,260,path);
strcpy_s(hist,260,_T("1")); // nach Ausführung dieser Zeile ist das array path_new mit 0xfe überschrieben
strcpy_s(path_new,260,hist);

}




es wäre schön, wenn mir jemand helfen würde.

Gruß
Klaus
 
C++:
TCHAR hist[128+1];
...
strcpy_s(hist,260,_T("1"));
"hist" hat keine 260 Zeichen Kapazität, deshalb der Fehler.
Wenn du Quellcode postest, benutze bitte die Code-Tags: [code=cpp]...[/code]. Es ist dann besser zu lesen :)

Gruß
MCoder
 
Hallo Larry

sorry, das war ein Schreibfehler, im Orginal hatte ich hier "128". Diese Größenangabe wird eigentlich nur benutzt um ein Schreiben über Puffergrenzen hinaus zu verhindern. In meinem Beispiel ist path_new mit 23 Zeichen geladen und über die letzte Zeile wird lediglich 1 Zeichen dazu kopiert, sodaß diese Länge auf keinem Fall überschreiben wird.
Mich würde interessieren ob bei Euch dieser Fehler auch auftritt. Vielleicht könnte jemand bei sich diesen Code laufen lassen.

Gruß
Klaus
 
Hallo Klaus,

ich bin nicht Larry; das ist nur der Urheber meines Signatur-Zitats :)
Den Code habe ich mal ausprobiert. Der Fehler tritt nur mit der Schreibfehler-Version auf, ansonsten nicht.

Gruß
MCoder
 
Hallo MCoder,
vielen Dank für die Unterstützung. Bei dem Beispiel Code hast Du recht, im Orginal Code, der ein bisschen umfangreicher ist, leider nicht. Aber Dein Tip hat mich auf den richtigen Weg gebracht. Scheinbar ist der 2. Parameter von strcpy_s (numberOfElements) nicht die komplette Pufferlänge, sondern die Größe des noch zu verfügungstehenden Puffers.
Beispiel:
TCHAR buff1[10];
TCHAR buff2[20];

strcpy_s(buff1,10,_T("123456"));
strcpy_s(buff2,20,_T("123"));
len = strlen(buff1);

strcpy_s(&buff1[len],10,buff2); // Fehler
strcpy_s(&buff1[len],10-len,buff2); // OK


mir war das leider nicht klar.

nochmals Danke

Klaus
 
Zuletzt bearbeitet:
Scheinbar ist der 2. Parameter von strcpy_s (numberOfElements) nicht die komplette Pufferlänge, sondern die Größe des noch zu verfügungstehenden Puffers.
Was ja eigentlich auch logisch ist, da strcpy_s nur die aktuelle Kopieraktion betrachtet und den Speicher ab der übergebenen Adresse überprüft.

Gruß
MCoder
 
Zurück