C++ 检测C+中的意外省略尺寸+;

C++ 检测C+中的意外省略尺寸+;,c++,arrays,static-analysis,C++,Arrays,Static Analysis,考虑以下代码段: #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; } #包括 使用名

考虑以下代码段:

#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;

}
#包括
使用名称空间std;
INTA[10][2];
int b[10][2];
int main(){
//有意

cout如果这只是的问题,您可以使用
std::array
,这将不允许:

    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
使用d1=std::数组;
使用d2=std::数组;
d2 a;
d2 b;

std::cout另一种选择是使用具有适当运算符错误处理的专用多维数组库,如boost::multi_array()。这通常比使用嵌套容器或POD数组更好。

如果我没有弄错,则只定义相关指针之间的算术行为。“指针”
a[0]
b[0]
并不是真的相关,所以在我看来这绝对是未定义的行为。你可以装配编译器打印出解析树,并检查是否有任何算术表达式涉及指针类型的操作数。叮当可能会让这变得简单,不知道。啊,根据Joachims敏锐的观察,试试叮当的UBSan。@KerrekSB好吧,我可能错了(这是众所周知的!)我只记得在某个“官方”的地方读过它:)@JoachimPileborg:你说得对。相关条款是5.7[expr.add]第6段。不幸的是,这只是我在一个小片段中展示这个例子的一种方式。实际上,它更为隐蔽,在一个巨大的科学代码中乱放着一堆if语句。不过,这是一个好主意。我尝试了这个方法,但未能按预期编译。实际上,我更喜欢在现有unch上有警告的东西愤怒的代码,但到目前为止,我还没有尝试这样做,所以这是最好的答案