Обнаружение случайного отклонения в С++

Рассмотрим следующий фрагмент:

#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, так и в С++, но в базе кода, с которой я работаю, это, как правило, семантическая ошибка; измерение, как правило, было исключено во вложенном цикле. Есть ли какой-либо флаг -W или инструмент статического анализа, который может обнаружить это?

Ответ 1

Вы можете использовать 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

Ответ 2

Другим вариантом является использование специализированной многомерной библиотеки массивов с соответствующей обработкой ошибок оператора, например boost:: multi_array (http://www.boost.org/doc/libs/1_55_0/libs/multi_array/doc/user.html). Обычно это лучше, чем использование вложенных контейнеров или массивов POD.

Ответ 3

Если это относится только к < как в примере, перегрузка оператора < для int * может помочь - вы можете перегрузить оператора для генерации ошибки времени компиляции.