argc und argv können gemein sein - wie sichere ich mich davor?



  • Servus.

    Ich mache gerade ein Programm was zwei Parameter beim Programmstart erwartet.
    Diese Parameter verwende ich anschließend mit argv[1] und argv[2].

    Neulichs habe ich mir die Registry zerschossen, weil das Programm keinen Parameter bekommen hat und dann nicht die Datei (die per Parameter übergeben wird) sondern meine Registry bearbeitet hat.

    Gibt es irgendwie eine sichere Abfrage:

    Wenn du kein Parameter bekommen hast, führe den Code bzw. das Programm nicht aus.

    Hab schon an
    if (argc>1)

    gedacht. Aber Frage ist halt, wenn ich kein Parameter angebe und er dann automatisch meine Registry bearbeiten will, ob er den Pfad zu Registry auch automatisch als argv[1] anlegt und somit durch meine Prüfung durchkommt?
    Wisst ihr wie ich meine?



  • Das ist jetzt nicht direkt ein C++-Problem.
    Wie hast du das überhaupt geschafft, der Zugriff auf Registry-Datei ist doch normalerweise gesperrt? 😕
    Außerdem kommt der Pfad zu der Datei ja nicht einfach so aus der Luft in dein Programm, sondern muss ja auf irgendeine Art angegeben worden sein.

    Ohne jetzt allzu viel über dein Programm zu wissen, dürfte es wohl am schlauesten sein, argc zu prüfen und den Pfad zur Reg.-Datei nicht als Fallback einzusetzen...



  • Also ich würde auch sagen, dass der Fehler da nicht bei C++ liegt, sondern eher an deinem Aufruf. Kannst du das Problem nachstellen?



  • DWORD dw = ::GetPrivateProfileString(NULL, _T("KEY"),_T(""), szT, _countof(szT), argv[1]);
    

    Der letzte Parameter wird mittels argv[1] übergeben.
    Wenn der leer ist, nimmt er sich die Registry.



  • pizzaro schrieb:

    Der letzte Parameter wird mittels argv[1] übergeben.
    Wenn der leer ist, nimmt er sich die Registry.

    Dann musst du logischerweise argc bzw. argv vorher selbst prüfen, wenn du das verhindern willst. Wo ist das Problem?



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ist doch ganz einfach du must prüfen ob argc und argv den Anforderungen entsprechen die Dein Programm erwartet um korrekt arbeiten zu könne, wenn diese Anforderungen nicht erfüllt sind dann soll das Programm eben nicht das tun für das es vorgesehen ist, sondern z.B. eine Fehlermeldung ausgeben. Was ist also dein Problem? Wenn du also genau 2 Kommandozeilenparameter erwartest könnte eine Abfrage wie folgt aussehen:

    if(argc != 3){
        printf("Too less arguments\n");
        exit(1);
    }
    

    Natürlich ist es dann noch angebracht den Inhalt der Kommandozeilenparameter zu checken, ob der in der vorliegenden Form überhaupt ohne Schaden anzurichten verarbeitet werden kann.



  • Warum wurde der Post überhaupt in das WinAPI Forum geschoben, das ist kein primäres Problem von GetPrivateProfileString(....), oder ?

    Sondern eher ein konditionales ISO C++ Problem



  • if(argc != 3){
    printf("Too less arguments\n");
    exit(1);
    }

    Nimm lieber dashier:

    if(argc != 3)
    {
        cout << "Fehlermeldung:.....";
        exit(1);
    }
    

    Ist strukturierter.
    Printf ist veraltet und von den compilern nicht gern gesehen.



  • aisad schrieb:

    if(argc != 3){
    printf("Too less arguments\n");
    exit(1);
    }

    Nimm lieber dashier:

    if(argc != 3)
    {
        cout << "Fehlermeldung:.....";
        exit(1);
    }
    

    Ist strukturierter.
    Printf ist veraltet und von den compilern nicht gern gesehen.

    ^^unsinn!
    🙂



  • Printf ist veraltet und von den compilern nicht gern gesehen.

    Blödsinn. printf wird nur von den C++-Experten hier im Forum nicht gern gesehen 😃


  • Mod

    aisad schrieb:

    Ist strukturierter.
    Printf ist veraltet und von den compilern nicht gern gesehen.

    Worthülsen... Definiere "strukturiert"!
    Bekommt Dein Comliler dann Kopfschmerzen wenn er printf sieht? 🤡



  • Martin Richter schrieb:

    aisad schrieb:

    Ist strukturierter.
    Printf ist veraltet und von den compilern nicht gern gesehen.

    Worthülsen... Definiere "strukturiert"!
    Bekommt Dein Comliler dann Kopfschmerzen wenn er printf sieht?

    'cout' interpretiert den input nach eigenem gutdünken. das finden manche vielleicht toll.
    🙂


  • Mod

    pizzaro schrieb:

    DWORD dw = ::GetPrivateProfileString(NULL, _T("KEY"),_T(""), szT, _countof(szT), argv[1]);
    

    Der letzte Parameter wird mittels argv[1] übergeben.
    Wenn der leer ist, nimmt er sich die Registry.

    Upps. Das ist ein undokumentierter Seiteneffekt.
    Wird NULL als Dateiname angegeben erhäöt man Zugriff auf einen Join der WIN.INI und den Ast HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion



  • Kompiliere mal etwas mit printf und dann mit cout und schau dir das auf der Assembler-Ebene im Disassembler an. Glaube eher dein Compiler bekommt bei cout Kopfschmerzen 😉


Log in to reply