Überschreiben des Speichers
-
Ich lerne C++ in der Schule und ich bin dem Stoff schon weit vorraus, aber mein Lehrer ( C verrückter bei dem man mehr von C als von C++lernt ) hat neulich etwas interessantes erklärt:
Er sagte, dass Funktionen wie scanf, strcat, strcpy u.s.w. bei char-Feldern den reservierten Speicher in bestimmten Fällen ( Beispiele könnt ihr euch ja denken ) überschreiben.
Stimmts; und wenn, funktioniert es mit cin richtig?
-
Ja, das stimmt - Funktionen auf char* Basis kontrollieren nicht, wieviel Speicher sie wirklich zur Verfügung haben. Aber das kann dir mit cin auch passieren, wenn du mit nackten char-Arrays arbeitest. (std::string passt auf, wieviele Daten eingelesen werden und vergrößert im Notfall seinen Speicher)
-
Danke, dass mit std::string wusste ich auch.
Müsste man Jetzt jedesmal wenn man ein char-feld einlesen möchte mit Schleifen und getch() oder cin.get() arbeiten?
-
|M| schrieb:
Danke, dass mit std::string wusste ich auch.
Müsste man Jetzt jedesmal wenn man ein char-feld einlesen möchte mit Schleifen und getch() oder cin.get() arbeiten?Hi,
ich würde der Einfachheit halber einen string einlesen und danach prüfen, ob der Inhalt in das char-Feld passt (s.length() < sizeof(charArray);)....
Wenn ja: Kopieren.Gruß,
Simon2.
-
Danke, aber ich habe nicht nach alternativen gesucht.
Es ging mir nur darum mein wissen abzurunden.
-
Sorry, man kann seine Beiträge als nicht-Mitglied nicht ändern.
Ich habe mich Falsch ausgedrückt.
Ich wollte einfach nur bei meinen char-feldern bleiben.
-
scanf, strcat, strcpy
Diese Funktionen sind unsicher richtig. deshalb sollt man bei denen auch genau wissen was man tut.
oftmals weiss man eben nicht, was in einem qellstring drinnesteht ....nen strlen z.b. zaehlt die zeichen bis zum ersten vorkommen von 0
wenn du nen speicherbereich hasst wo kein 0 drinnesteht, zaehlt er quasi ueber deine variable hinaus ... die lustigsten effekte sind dann die folge.
genau so wie strcat ned pruefen kann ob genug speicher reserviert wurde.die dinger sind also quasi so sicher, wie du sorgfaeltig alle bedingungen abpruefen kannst. meist schreibt man dann ca 80% checkroutinen und nur noch 20% wirklichen code ^^
ne alternative sind die strn... funktionen, da wird der speicher begrenzt in dem reinschreiben kann ....
bei nem
char[128] buffer;
....
strncat(strbuffer,128,"was weiss ich");
beim strncat selber kann z.b. ned mehr ganz so viel schiefgehen ... aber nicht vergessen, wenn der string ned reinpasst, schreibt er kein terminate zeichen ^^ tolle fehlerquellen fuer nachher ^^eigentlich sollt man in c++ keine c-strings mehr verwenden ... aber leider sind die c ellipsenfunktionen (scanf, sprintf) zwar nicht typsicher, eigentlich insgesamt total unsicher, aber meist um vieles handlicher als die entsprechenden c++ streamfunktionen ....
Ciao ---
-
RHBaum schrieb:
...
ne alternative sind die strn... funktionen, da wird der speicher begrenzt in dem reinschreiben kann ....Finde ich prinzipiell auch gut und richtig (vA snprintf()), aber bei unserem Compiler hier (IBM xlC V1.8 f. zOS) ist strncpy() offensichtlich nur ein "Alias" auf memcpy(). Da Letzterer aber immer die komplette Zahl an Bytes kopiert (und sich natürlich nicht um '\0'-Bytes kümmert), wird die Verwendung davon nicht wirklich sicherer.

OK, man greift zwar nur lesend auf unerlaubten Speicher zu, aber wirklich toll finde ich das auch nicht - dann lieber ein "echtes strcpy()", bei dem jeder um die Gefahr weiß, als so'n Sch***.
Gruß,
Simon2.