Forum: Compiler & IDEs struct und strcpy


von Max (Gast)


Lesenswert?

moin,
1
#include <stdio.h>
2
#include <string.h>
3
4
typedef struct {
5
  char Jahr[10];
6
  char Monat[10];
7
  char Tag[10];
8
} DATE;
9
10
DATE datum;
11
12
void check_datum(char *tmp)
13
{
14
  strcpy(datum.Monat, tmp[0]);
15
  printf("%s", datum.Monat); //Fehler
16
}
17
int main(void)
18
{
19
  char date_tmp[20] = {0};
20
  char *zeiger;
21
  printf("Bitte das aktuelle Datum im Format DD.MM.YYYY eingeben: ");
22
  scanf("%s", date_tmp);
23
  check_datum(date_tmp);
24
}
Hat hier jemand eine Idee warum sich das Programm in der markierten 
Zeile verabschiedet?
Gruß Max

von Peter (Gast)


Lesenswert?

dafür müssen wir wissen was du ein INPUT eingibst. Wenn du mehr als 20 
zeichen eingibst ist klar das ein Programm sich undefiniert verhählt.

Mal wieder ein schönen beispiel wie man sicherheitslücken in C programm 
ein baut!

von Klaus W. (mfgkw)


Lesenswert?

Wenn ich Compiler wäre, würde ich das anmeckern:
1
strcpy(datum.Monat, tmp[0]);
Vermutlich hast du einfach die Warnung ignoriert?

Denn tmp[0] ist ein char, verlangt wird aber bei strcpy() char*.
Wahrscheinlich meintest du:
1
strcpy(datum.Monat, &tmp[0]);
bzw.
1
strcpy(datum.Monat, tmp);

In deiner Form kopierst du ab der Adresse, die in dem einen
Byte tmp[0] steht (also irgendwo ganz unten im Speicher) solange,
bis eine abschließende 0 kommt. Das kann durchaus mehr
als 10 Zeichen lang sein.

Wie bereits Peter treffend sagt, fehlt es aber auch an
allen Sicherheitsmaßnahmen...

von Klaus W. (mfgkw)


Lesenswert?

Abgeshen davon, daß es ohnehin Unfug ist...

Der Benutzer soll etwas in der Form DD.MM.YYYY eingeben?
Das sind ja schon 10 Zeichen, zzgl abschl. 0 macht es 11.
Das wird in ein char[20] kopiert und in der Funktion dann
in ein char[10], das kann gar nicht gut gehen (von dem Fehler
mit tmp[0] abgesehen).

(Wenn das gehen würde. wäre es immer noch Quatsch, das ganze
Datum in den Monat zu kopieren, aber da kommt es dann auch
nicht mehr drauf an.I

von der mechatroniker (Gast)


Lesenswert?

> (Wenn das gehen würde. wäre es immer noch Quatsch, das ganze
> Datum in den Monat zu kopieren, aber da kommt es dann auch
> nicht mehr drauf an.I

Das Kuriose ist, dass es aber sogar funktionieren würde (wenn man denn 
auch später das ganze Datum wieder aus dem Monat liest). Landet das 
abschließende '\0' eben in Tag[0], wo sie von einem strcpy oder strlen 
auch wieder gefunden wird...

von Klaus W. (mfgkw)


Lesenswert?

In diesem Fall ja, solange der Benutzer es nicht mit der Länge 
übertreibt.
So wie das Programm aber aussieht, geht es mit der nächsten Erweiterung
wieder schief.  Ziemlich gruselig...
Vielleicht sind die Jahr[] und Tag[] ja nur drin, weil es sonst
schon vorher abstürzt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.