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?
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. –
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. –
Ah, im Licht von Joachims scharfsinniger Beobachtung, probiere Clangs UBSan. –