Article View: ch.comp.os.linux
Article #18269Re: strcpy/strcat Anomalie
From: Peter Ehrbar
Date: Thu, 23 Mar 2000 00:00
Date: Thu, 23 Mar 2000 00:00
67 lines
3198 bytes
3198 bytes
Dominik Berner <kingdom@weltuntergang.ch> wrote:
>Mir ist aufgefallen, dass man in C Arrays �berlaufen lassen kann, ohne
>eine Fehlermeldung zu kriegen.
Klar kann man das -- genauso, wie mit man mit wildfremden Leuten Sex
haben kann, ohne Kodome zu verwenden. Die Folgen sind allerdings
unvorhersehbar. ;)
>Das ganze funktioniert so (Beispiel-Programm am ende)
>Ein array [one] mit gr�sse 1 wird mit einem Zeichen gef�llt ('\0'
>�berschrieben). Danach werden an ein anderes, gr�sseres Array [cross]
>mit strcat *mehr* Zeichen angeh�ngt, als eigentlich reinpassen. Das
>Resultat: one enth�lt das komplette Array cross. Werden die Arrays in
>umgekehrter Reihenfolge deklariert, enth�lt one nur die �berz�hligen
>Zeichen,
Offenbar werden die Arrays im Speicher direkt hintereinander angelegt.
>wird eines, oder beide der Arrays Global definiert, verh�lt
>sich alles normal.
Dann sind sie nicht mehr hintereinander, aber dass sich das "normal"
verhaelt, ist etwa so "normal", wie wenn Du unbeschadet durch ein
Minenfeld spaziert bist.
>Keine Ahnung, wieso es sich genau so verh�lt
Das ist mehr oder weniger Zufall. "Mehr oder weniger" deshalb, weil es
natuerlich nicht zufaellig ist, wo Compiler und Linker das Zeugs
hintun, aber man sollte diesbezueglich keine Annahmen machen.
>und ob man das irgendwie
>brauche kann um z.B. Programme zu umgehen oder einen DoS auszu�ben.
Pfui aber auch! An sowas denkt man nicht mal. ;)
>#include <stdio.h>
>#include <string.h>
>
>main()
>{
> char cross[5];
> char one[1];
>
> strcpy(one, "x");
Den Ueberlauf hast Du hier schon produziert: "x" ist zwei Zeichen
lang, naemlich das 'x' und das '\0'.
> strcat(cross, "123456789");
Teufel auch, das ist nun konkret krass. 'cross' hat einen
undefinierten Inhalt -- irgendwelche Zeichen. Ausserdem
musst Du davon ausgehen, dass es nicht mit '\0' abgeschlossen
ist. Somit wird "123456789" irgendwo hingepappt. Produzierst
Du mit diesem Kamikaze-Code nicht massenweise core dumps?
Du bist nicht zufaelligerweise Programmierer bei MS? :->>>
Also merke: Variablen (insbesondere Arrays) sind normalerweise nach
dem Programmstart nicht initialisiert und enthalten irgendwelche
Werte. Strings muessen ueblicherweise mit dem Zeichen '\0'
abgeschlossen sein. Dies ist bei der Dimensionierung von Arrays
zu beruecksichtigen, z.B. fuer einen String mit vier Zeichen:
char str[5]; nach strcpy(str, "2000") sieht str wie folgt aus:
{ '2', '0', '0', '0', '\0' }
Technical Details
Message-ID:
<r80ldsksv08p65606ao7q1pq037nuro95f@4ax.com>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<38DA5C18.8317881@weltuntergang.ch>Show Full Headers
Complete Article Headers
X-Google-Language: GERMAN,ASCII X-Google-Thread: f4b73,5512f1ce4457836d X-Google-Attributes: gidf4b73,public From: Peter Ehrbar <ehrbarp@dial.eunet.ch> Subject: Re: strcpy/strcat Anomalie Date: 2000/03/23 Message-ID: <r80ldsksv08p65606ao7q1pq037nuro95f@4ax.com> X-Deja-AN: 601480230 Content-Transfer-Encoding: 8bit References: <38DA5C18.8317881@weltuntergang.ch> Content-Type: text/plain; charset=ISO-8859-1 X-Trace: news 953848864 193.72.22.182 (Thu, 23 Mar 2000 23:01:04 MET) Organization: EUnet AG, Switzerland. A KPNQwest Company. MIME-Version: 1.0 NNTP-Posting-Date: Thu, 23 Mar 2000 23:01:04 MET Newsgroups: ch.comp.os.linux