在C ++中检测意外省略的维度

时间:2013-12-23 22:46:53

标签: 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;

}

显然(或者可能不是每个注释)第二种情况是C和C ++中的有效指针算法,但在我使用它的代码库中通常是语义错误;通常在嵌套的for循环中省略了维度。有没有-W标志或静态分析工具可以检测到这个?

3 个答案:

答案 0 :(得分:8)

您可以使用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

答案 1 :(得分:4)

另一种选择是使用具有适当的操作符错误处理的专用多维数组库,例如boost :: multi_array(http://www.boost.org/doc/libs/1_55_0/libs/multi_array/doc/user.html)。这通常是一个更好的主意,然后使用嵌套容器或POD数组。

答案 2 :(得分:2)

如果仅关注&lt;&lt;例如,运算符的重载&lt;&lt;&lt; for int *可能会有所帮助 - 您可以重载运算符以生成编译时错误。