[C/C++] scanf=> BufferOverflow Möglichkeit?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von p90, 12. Oktober 2006 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 12. Oktober 2006
    scanf=> BufferOverflow Möglichkeit?

    Hi,
    es geht um dieses Prog:
    Code:
    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <assert.h>
    #include <stdlib.h>
    float time=0, time2=0, df=0;
    int choice;
    /*
    df=Daempfungsfaktor
    time=T (Periodendauer)
    time2= T1/2 (Zeit bis Amplitude 1/2*^s0 erreicht wird)
    */
    
    int headline()
    {
     system("cls");
     printf("#######################################################\n");
     printf("##### Berechne T 1/2 bei gedaempften Schwingungen #####\n");
     printf("#######################################################\n");
     printf("\n");
     printf ("Daempfungsfaktor in Prozent =%f\n", df);
     printf ("T(Periodendauer) in Sekunden=%f\n", time);
     printf ("T 1/2 ind Sekunden=%f\n\n", time2); 
     printf("Copyright by *************** 2006\nVersion 1.0\n\n\n\n"); 
     
     return 0;
    }
    
    float saveflout()
    {
     char buf[1024];
     fscanf(stdin,"%1023s",buf);
     buf[1024] = '\0';
     return atof(buf);
    }
    
    int main()
     {
     do
     {
     df=0;
     time=0;
     time2=0;
     choice=0;
     
     do
     {
     df=0;
     headline(); 
     printf("Geben sie bitte den Daempfungsfaktor in Prozent an:");
     fflush(stdin);
     df=saveflout();
     }
     while((df<=0) || (df>=100));
     
     do 
     {
     time=0;
     headline();
     printf ("Geben sie bitte die Periodendauer in Sekunden ein:");
     fflush(stdin);
     time=saveflout();
     }
     while(time<=0); 
     
     time2=log(0.5)/log((df/100))*time;
     
     do
     {
     headline();
     printf("Nochmal?\n[J] JA!\n[N] Nein und Exit!");
     fflush(stdin);
     choice=getch();
     }
     while(!((choice=='J') or (choice=='j') or (choice=='N') or (choice=='n'))); 
     
     }
     while((choice=='j') || (choice=='J')); 
     return 0;
     }
    
    
    
    
    Wie man schön sehen kann, wird ja per scanf zweimal eine Wert eingelesen.
    Dieser Wert wird dann in eine Float Variable geschrieben.
    Gibt es eine Möglichkeit, noch bevor der Wert in die VAriablen geschrieben wird zu überprüfen ob es ein gültiger Float Wert ist?

    ZB könnte ja jemand auf die Idee kommen und 10^100 sekunden einzugeben. Dieser Wert wäre kein gültiger Float Wert. Somit müsste es soch zu einem BufferOverflow kommen wenn ich das richtig sehe. Leider kenne ich nur Methoden um die Gültigkeit eines Wertes zu überprüfen wenn er bereits in eine Variable geschrieben wurde, zB. per Assert oder wie bei mir, mit den While Schleifen.
    Aber dann kann der BufferOverflow ja schon passiert sein oder irre ich mich?
    Passt scanf von selber auf, das wenn ich durch das %f nur nach einer Float Zahl suche, es auch nur eine FLoat Zahl an die Variable übergibt?
    Danke für eure Hilfe!
    bis denne
    p90
     
  2. 12. Oktober 2006
    AW: scanf=> BufferOverflow Möglichkeit?

    Hi,

    1. goto ist schlecht

    2. So kannst dus 'gut' und sicher machen:
    Code:
    char buf[1024];
    fscanf(stdin,"%1023s",buf);
    buf[1024] = '\0';
    float dada;
    dada = atof(buf);
    atof = Ascii to Float.

    Mfg,

    Kolazomai
     
  3. 12. Oktober 2006
    AW: scanf=> BufferOverflow Möglichkeit?

    Zu 1)
    Das goto wird noch einer Do-While-Schleife weichen.

    Zu2)
    Würdest du das bitte ein bischen näher Erklären?
    Konnte leider per google nichts vernünftiges zu fscanf finden, bzw. hab es nicht verstanden.
    Auf welche der 3 Abfragen beziehst du dich?
    Meines Wissens nach sind nur die ersten beiden gefährdet, da bei der 3ten ja nur ein Zeichen zugelassen wird und das kann einen Flout nicht sprengen.
    Warum aber soll ich bei den ersten beiden abfragen die einzelnen Buchstaben abfragen? Ich möchte doch nur ihren Wert? ZB. Wenn da einer 10000000 für die Sekunden eingibt, dann will ich doch die Zahl direkt haben und nicht erst noch die einzelnen Zeichen in eine Zahl umwandeln.
    Trotzdem vielen Dank für deine Hilfe
     
  4. 12. Oktober 2006
    AW: scanf=> BufferOverflow Möglichkeit?

    Naja, du kannst es natuerlihc auch mit
    scanf("%X.Yf",&floatwert);
    einlesen

    X = Werte vor dem Komma
    Y = Werte hinter dem Komma


    fscanf ist halt fuer Streams geeignet.
    goto ist wirklich schlecht, nimm lieber eine while(1) // for(; schleife und beende sie mit break;
     
  5. 12. Oktober 2006
    AW: scanf=> BufferOverflow Möglichkeit?

    Ich lese per fscanf von der stdin 1023 bytes ein ( das wird dein Float ). Danach Null-Terminier ich den String. Danach kannst du strtof oder atof aufrufen.

    Oder machs so wie Fallenangel es gesagt hat ...

    Mfg,

    Kolazomai
     
  6. 12. Oktober 2006
    AW: scanf=> BufferOverflow Möglichkeit?

    Hi,
    also habs jetzt einfach mal anch Kolazomai Lösung gemacht.
    Verstehe sie zwar noch nicht ganz so, aber wenn sie sicher ist ^^.

    Hab oben mal den neuen Code reineditiert.
     
  7. 12. Oktober 2006
    AW: scanf=> BufferOverflow Möglichkeit?

    Na dann, erledigt.

    ~closed~

    Mfg,

    Kolazomai
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.