Надо понимать что пишешь. И не "прострелить себе ногу".
Когда в проекте четыре разработчика, от одного программиста зависит даже меньше, чем одна четвертая. Потому — логирование действий, отладочные символы включены, сохранение полного дампа при падении и последующий совместный разбор полетов.
Вся же высокоуровневость в языках, помимо всего прочего, придумывалась и для того, чтобы
ограничить программиста. Чтобы он не мог прострелить ногу случайно, а только постаравшись.
Допустим, мы записываем что-либо в A[B]. Ошибка возникает, когда в переменную B помещается неправильное значение, а обнаруживается в лучшем случае (в Паскале?), когда мы пробуем записать/прочитать в A[B]. В худшем - ещё дальше. Но всё равно не тогда, когда она действительно возникает - в результате неправильного вычисления значения B
Так вот. В большинстве случаев индексы вычисляются в пределах той же самой функции, где происходит обращение к элементу коллекции. Еще есть вариант, когда предвычисленное значение индекс берется из конкретной переменной — которая пишется в двух-трех местах. То же относится к указателям на объекты — если мы ловим первое же незаконное разыменование, есть очень хорошие шансы проследить время жизни объекта и указателя прямо с этого места. Если же мы поймали разыменование перезатертого из-за переполнения буфера указателя, то все куда сложнее.
vim и gcc, остальное лишнее.
...вы прямо на контролере запускаете vim, что ли? Обычно такие штуки пишут на нормальном компьютере, в нормальном редакторе, а потом кросс-компилируют.
Моя мечта, конечно, чтобы в несложных случаях оно отлавливалось на этапе компиляции.
H. Xi, F. Pfenning "Eliminating Array Bound Checking Through Dependent Types". В целом, там рисуется система линейных неравенств и решается в целых числах.