Overflow und Rangeheck?



  • Hallo liebe Gemeinde,

    wie bereits in der Überschrift beschrieben gibt es in C bzw. C++ eine kompiler oder preprozessor Anweisung mit welcher man einen generellen Overflow- und Rangecheck einschalten kann?

    in Turbo Pascal wär die mit den Anweisungen:
    {R+} bzw. {Q+} möglich in C bzw C++
    fällt mir dazu nur assert ein. Sollte jemand eine Idee haben bit nur zu...

    Ich verwende Visual C++ 2010

    gruß
    assaziel


  • Mod

    Nein, das gibt es allgemein nicht. Spezielle Compiler können dies aber durchaus anbieten. Insbesondere bei den STL-Containern ist es üblich, dass diese auch einen Debugmodus bieten, der auf interne Konsistenz prüft. Overflow und Rangechecks bei Arrays* gibt es oft auch. Musst du mal im Handbuch (oder besser bei Google) gucken, was VS2010 kann und wie man es aktiviert. Ich bin mir ziemlich sicher, dass es alle diese Dinge beherrscht.

    *: Wobei der Fall der Arrays ja schon dadurch erledigt sein sollte, dass man stattdessen STL-Container nutzt, die fast immer einen Debugmodus bieten.



  • vector.at(index) statt vector[index]


  • Mod

    hardware schrieb:

    vector.at(index) statt vector[index]

    Ich verwende at ehrlich gesagt nie. @SeppJ, du vielleicht?


  • Mod

    Arcoth schrieb:

    hardware schrieb:

    vector.at(index) statt vector[index]

    Ich verwende at ehrlich gesagt nie. @SeppJ, du vielleicht?

    Nein, welchen Grund sollte ich dafür haben? Wenn die Möglichkeit besteht, dass ein Index out-of-range ist, dann ist mein Programm falsch und ich programmiere keine falschen Programme 🕶 .

    Und wenn während der Entwicklung der Verdacht besteht, dass vielleicht doch mal ein Index out-of-range sein könnte, dann ist dieser Fehler mit anderen Mitteln viel schneller gefunden. Meistens mit so etwas wie valgrind, anderen Debuggern oder mit den schon erwähnten Debugfeatures der STL.

    Aber meistens einfach saubere Programmierung und den Compiler schön die Logikfehler finden lassen. valgrind und Debug-STL bloß noch einmal am Ende zur Sicherheit laufen lassen.



  • Hallo,

    Aber meistens einfach saubere Programmierung und den Compiler schön die Logikfehler finden lassen. valgrind und Debug-STL bloß noch einmal am Ende zur Sicherheit laufen lassen.

    Tja meine Meinung mit dem sauberen programmieren.
    Wie bereits oben geschrieben werden in Pascal diese Schutzmechanismen verwendet und können im QT ab bzw an gestellt werden.
    Jetzt sitz ich auf den haufen und darf es nach portieren. na mal sehn was wir da machen...

    Danke für die Antwort...

    //05.12.2014 9:39 vielleicht geht es ja so
    folgender quelltext aus pascal muss nach c bzw. c++ portiert werden

    PROGRAM rang;
    USES crt;
    
    VAR
    Over : ARRAY [1..6] OF integer;
    i: integer;
    
    {$Q+} {$R-} {Hier Rangecheck aus}
    BEGIN 
          For i:1 TO 10 DO
          BEGIN
              Over[i] := i;
              WriteLN('Der Wert von i: ', Over[i]
          End;
    End;
    

    So wenn der Check Ausgeschaltet ist wird ausgegeben:

    Der Wert von i: 1
    ...
    Der Wert von i:10

    Wenn Rangecheck (also zeile 8: Wir {$R+}) an geschaltet ist wird ausgeben:

    Runtime error 201 at $004014CD...

    sprich ich möchte am liebsten im quelltext irgendwelche flags setzen können um range an bzw. ausschalten zu lassen. BZW. Zumindest in der Entwicklungszeit eine Debugumgebung die mir solche Laufzeifehler anzeigt.
    Ideen?

    Kontext: Komme selber nicht aus der Pascalecke habe aber erfahren das in Pascal es üblich ist diese Checks ein zu schalten und dann wieder aus zuschalten wenn mans brauch. Dem entsprechend ist der Prgrorammier still etwas "anders" als in c.

    Mit den Besten Wünschen und ein schönes Wochenende
    assaziel


  • Mod

    Willst du etwa die Fehler mit portieren oder was möchtest du erreichen?

    Ansonsten ist das doch genau der Unterschied zwischen operator[] und at(). Bei at sind garantiert Bereichsprüfungen dabei, bei operator[] sind sie optional im Debugmodus einschaltbar.

    Aber irgendwie kapier ich immer weniger, wofür das gut sein soll. Entweder ist der Code richtig und man braucht keine Prüfungen oder der Code ist falsch und man merkt dies mittels der optionalen Prüfungen während des Debuggens und entfernt die Fehler und die Prüfungen im Endprodukt.



  • assaziel schrieb:

    Kontext: Komme selber nicht aus der Pascalecke habe aber erfahren das in Pascal es üblich ist diese Checks ein zu schalten und dann wieder aus zuschalten wenn mans brauch. Dem entsprechend ist der Prgrorammier still etwas "anders" als in c.

    Auch in Pascal sollte die 10 nicht einfach in der Schleife auftauchen. In C++ kann man solche Überläufe auch komplett vermeiden

    #include <iostream>
    using namespace std;
    
    int main() {
    	int arr[10];
        int i = 0;
        for( auto& v: arr ) v=i++;
        for( auto v: arr ) std::cout << v << endl;
    }
    


  • hallo,

    also danke für die Antworten, ich muss mal schauen wie ich das mache.
    Trotdem danke. Ich melde mich wenn ich eine akzeptable Antwort habe.



  • Suchst du sowas wie asserts?


Anmelden zum Antworten