Mailinglist Archive: opensuse-programming-de (118 mails)
| < Previous | Next > |
Re: Pointer und Funktionen
- From: Eilert Brinkmann <eilert@xxxxxxxxxxxxxxxxxxxxxxxx>
- Date: 18 Jul 2002 16:16:05 +0200
- Message-id: <xttofd5m89m.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Volker Kroll wrote:
> On Thu, 2002-07-18 at 14:41, Daniel Bauer / MList wrote:
> > IMHO funktioniert die Zuweisung so nicht ...
> > probier mal:
> >
> > void tester(char* test) {
> > strcpy (test, "langer String");
> > }
Das ist für sich genommen schon mal richtig, solange durch "äußere
Gegebenheiten" sichergestellt ist, daß der Pointer test auf einen
Speicherbereich zeigt, der groß genug ist, den neuen String samt
abschließendem Null-Byte (in diesem Fall also 14 Bytes) aufzunehmen.
Da man aber leicht vergißt, sowas sicherzustellen, stellt so eine
Funktion eine gute Fehlerquelle da -- so entstehen die berühmten
Buffer-Overflows, auf deren Kappe auch viele Sicherheitslücken gehen.
> Ne, das Ergebnis ist dasselbe (bzw. es gibt einen Segmaentation fault,
> den ich mit malloc umgangen habe.)
In Deinem Testprogramm wird in main() ein konstanter String an
tester() übergeben. Nun ist es so, daß String-Konstanten (mit gcc
unter Linux) in einem Speichersegment abgelegt werden, daß als
read-only markiert ist. Der damit unzulässige Versuch, den String zu
überschreiben, also schreibend auf dieses Segment zuzugreifen, wird
vom System abgefangen und dem Prozeß als "Segmentation fault"
signalisiert (SIGSEGV).
Eine mögliche Lösung hat Bernhard ja gezeigt. (Die Variante, bei der
in main() mit malloc() ein veränderbarer Speicherbereich für den
String reserviert wird.)
> Ich fürchte, daß ist wieder ganz trivial und ich mache mich hier zum
> Nabbel ....
Jain. Wenn man die Pointerei etc. erst einmal richtig verstanden hat,
ist das ganze *prinzipiell* recht trivial und logisch, aber trotzdem
kann man sich leicht in seinen Pointern verheddern -- gerade, wenn's
mal etwas komplexer wird.
Eilert
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Eilert Brinkmann -- Universitaet Bremen -- FB 3, Informatik
eilert@xxxxxxxxxxxxxxxxxxxxxxxx - eilert@xxxxxxx
http://www.informatik.uni-bremen.de/~eilert/
> On Thu, 2002-07-18 at 14:41, Daniel Bauer / MList wrote:
> > IMHO funktioniert die Zuweisung so nicht ...
> > probier mal:
> >
> > void tester(char* test) {
> > strcpy (test, "langer String");
> > }
Das ist für sich genommen schon mal richtig, solange durch "äußere
Gegebenheiten" sichergestellt ist, daß der Pointer test auf einen
Speicherbereich zeigt, der groß genug ist, den neuen String samt
abschließendem Null-Byte (in diesem Fall also 14 Bytes) aufzunehmen.
Da man aber leicht vergißt, sowas sicherzustellen, stellt so eine
Funktion eine gute Fehlerquelle da -- so entstehen die berühmten
Buffer-Overflows, auf deren Kappe auch viele Sicherheitslücken gehen.
> Ne, das Ergebnis ist dasselbe (bzw. es gibt einen Segmaentation fault,
> den ich mit malloc umgangen habe.)
In Deinem Testprogramm wird in main() ein konstanter String an
tester() übergeben. Nun ist es so, daß String-Konstanten (mit gcc
unter Linux) in einem Speichersegment abgelegt werden, daß als
read-only markiert ist. Der damit unzulässige Versuch, den String zu
überschreiben, also schreibend auf dieses Segment zuzugreifen, wird
vom System abgefangen und dem Prozeß als "Segmentation fault"
signalisiert (SIGSEGV).
Eine mögliche Lösung hat Bernhard ja gezeigt. (Die Variante, bei der
in main() mit malloc() ein veränderbarer Speicherbereich für den
String reserviert wird.)
> Ich fürchte, daß ist wieder ganz trivial und ich mache mich hier zum
> Nabbel ....
Jain. Wenn man die Pointerei etc. erst einmal richtig verstanden hat,
ist das ganze *prinzipiell* recht trivial und logisch, aber trotzdem
kann man sich leicht in seinen Pointern verheddern -- gerade, wenn's
mal etwas komplexer wird.
Eilert
--
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Eilert Brinkmann -- Universitaet Bremen -- FB 3, Informatik
eilert@xxxxxxxxxxxxxxxxxxxxxxxx - eilert@xxxxxxx
http://www.informatik.uni-bremen.de/~eilert/
| < Previous | Next > |