Здравствуйте, Кодт, Вы писали:
К>Есть смысл отказаться от голого сишного массива char(&)[N] в пользу полноценного типа boost::array<char,N> или чего-то в таком роде.
К>Тогда можно заставить ошибки ловиться в рантайме.
Про boost::array я помню, но он будет ловить эти ошибки во время выполнения, а не компиляции.
Вот пара примеров, когда MSVC 2008 c 4 уровнем дает предупреждение:
warning C4700: uninitialized local variable 'a' used
А)
int a[3];
int b=a[10];
Б)
int a[3];
a[9]=9;
int b=a[10];
А вот примеры, когда компилится без предупреждений:
В)
int a[3];
a[10]=10;
int b=a[10];
Г)
int a[3]={};
int b=a[10];
То есть, компилятор знает размер массива и даже следит за тем, какие элементы массива инициализированы, а какие — нет (см. примеры Б и В). Так что ему мешает в этих явных случаях выдавать хотя бы предупреждение о выходе за границы?