mikrocontroller.net

Forum: Compiler & IDEs struct und strcpy


Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,
#include <stdio.h>
#include <string.h>

typedef struct {
  char Jahr[10];
  char Monat[10];
  char Tag[10];
} DATE;

DATE datum;

void check_datum(char *tmp)
{
  strcpy(datum.Monat, tmp[0]);
  printf("%s", datum.Monat); //Fehler
}
int main(void)
{
  char date_tmp[20] = {0};
  char *zeiger;
  printf("Bitte das aktuelle Datum im Format DD.MM.YYYY eingeben: ");
  scanf("%s", date_tmp);
  check_datum(date_tmp);
}
Hat hier jemand eine Idee warum sich das Programm in der markierten 
Zeile verabschiedet?
Gruß Max

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich Compiler wäre, würde ich das anmeckern:
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:
strcpy(datum.Monat, &tmp[0]);
bzw.
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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.