2013-12-23 5 views
12

Betrachten Sie das folgende Snippet:Detect versehentliche elided Dimension in C++

#include <iostream> 
using namespace std; 

int a[10][2]; 
int b[10][2]; 

int main(){ 

    //intended 
    cout << a[0][0] - b[0][0] << endl; 

    //left out dimension by mistake 
    cout << a[0] - b[0] << endl; 

} 

Offensichtlich (oder vielleicht auch nicht pro Kommentar) der zweite Fall gilt Zeigerarithmetik in C und C++, aber in der Codebasis arbeite ich mit es ist im Allgemeinen ein semantischer Fehler; Eine Dimension wurde normalerweise in einer verschachtelten for-Schleife weggelassen. Gibt es ein W-Flag oder ein statisches Analyse-Tool, das dies erkennen kann?

+4

Wenn ich mich nicht irre, nur Arithmetik zwischen verwandten Zeigern Verhalten definiert. Die "Zeiger" 'a [0]' und 'b [0]' sind nicht wirklich verwandt, also ist es definitiv undefiniertes Verhalten IMO. –

+0

Sie könnten rig Ihr Compiler den Parsing-Baum zu drucken und überprüfen, ob irgendwelche arithmetische Ausdrücke Operanden von Zeigertyp beinhalten. Clang könnte das leicht machen, keine Ahnung. –

+0

Ah, im Licht von Joachims scharfsinniger Beobachtung, probiere Clangs UBSan. –

Antwort

8

Sie könnten std::array verwenden, die das nicht zulassen wird:

using d1=std::array<int, 2>; 
    using d2=std::array<d1, 10>; 

    d2 a; 
    d2 b; 

    std::cout << a[0][0] - b[0][0] << endl; // works as expected 

    std::cout << a[0] - b[0] << endl;  // will not compile 
+0

Ich habe das versucht und es kann nicht wie erwartet kompiliert werden. Ich würde eigentlich etwas bevorzugen, das Warnungen auf existierendem unveränderten Code hat, aber bis jetzt habe ich nichts versucht, also ist das die beste Antwort – frankc

2

Wenn dies nur die Sorge um < < Betreiber wie in Beispiel, Überlastung des Betreibers < < für int * könnte helfen - können Sie Betreiber Überlastung Fehler bei der Kompilierung zu erzeugen.

+0

Leider war das nur eine Möglichkeit für mich, in einem kleinen Schnipsel zu versuchen, müssen Sie dieses Beispiel zu zeigen. In Wirklichkeit ist es viel heimtückischer, verstreut entlang einer Reihe von if-Aussagen in einem riesigen wissenschaftlichen Code. Gute Gedanken. – frankc