Оптимизация gcc влияет на проверку границ - PullRequest
1 голос
/ 13 июля 2011

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

int a[4];

int main() {
  a[4] = 12; // <--
  return 0;
}

Это явно ошибка за границей, не так ли? Мне было интересно, когда gcc предупредит об этом, и обнаружил, что он будет делать это только при оптимизации -O2 или выше (на это влияет параметр -ftree-vrp, который устанавливается автоматически только для -O2 или выше). Я действительно не понимаю, почему это имеет смысл и правильно ли, что gcc не предупреждает иначе.

В документации есть что сказать по этому поводу:

Это позволяет оптимизаторам удалять ненужные проверки диапазона, такие как проверки привязки массива и проверки нулевого указателя.

Тем не менее, я не понимаю, почему эта проверка должна быть ненужной?

1 Ответ

1 голос
/ 13 июля 2011

В вашем примере постоянное распространение , а не распространение диапазона значений , и это, безусловно, вызывает предупреждение в моей версии gcc (4.5.1), независимо от того, * 1005 или нет* включен.

В общем, Java и Fortran являются единственными языками, поддерживаемыми gcc, который (Java по умолчанию и Fortan, если вы явно запрашиваете его с помощью -fbounds-check) будет генерировать код для проверки границ массива.

Однако, хотя C / C ++ не поддерживает ничего подобного, компилятор все равно предупредит вас во время компиляции, если он считает, что что-то не так.Для констант это довольно очевидно, для диапазонов переменных это несколько сложнее.

Предложение «позволяет компилятору удалять ненужные проверки диапазона» относится к случаям, когда, например, вы используете 8-битную переменную без знака дляиндексировать в массив, который содержит> 256 записей или 16-битное значение без знака, чтобы индексировать в массив из> 65536 элементов.Или, если вы перебираете массив в цикле, и (переменный) счетчик цикла ограничен значениями, которые можно доказать как константы времени компиляции, которые являются допустимыми индексами массива, поэтому счетчик никогда не сможетвыйти за границы массива.
В таких случаях компилятор не не предупредит вас и не сгенерирует никакого кода для целевых языков, где это поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...