Когда обращаться к целочисленному переполнению в C - PullRequest
2 голосов
/ 25 апреля 2010

Смежный вопрос: Как обнаружить целочисленное переполнение?

В коде C следует ли устранять целочисленное переполнение при добавлении целых чисел? Похоже, что указатели и индексы массивов нужно проверять вообще. Когда следует проверять целочисленное переполнение?

Когда числа добавляются в C без явно указанного типа или печатаются с помощью printf, когда произойдет переполнение?

Есть ли способ автоматически обнаружить целочисленное арифметическое переполнение?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2010

Общий ответ редко.Если результат должен быть действительным, но вместо этого переполнен, то вы должны были использовать больший тип.Если самого большого типа недостаточно, вы должны были использовать большую библиотеку int.

Не существует автоматического стандартного способа обнаружения этого, встроенного в C. Некоторое оборудование поддерживает его, но оно не является стандартным.Это было описано в теме, на которую вы ссылались.

Тип литералов всегда определен, просто он не всегда явный. Вот список литеральных типов. Обычно выполнение арифметики с литералами будет переполнено, если вам удастся переполнить любой тип, используемый компилятором для промежуточной операции, или когда результат будет присвоен типу с меньшей точностью, которыйне хватает места.

2 голосов
/ 02 мая 2010

Когда вы говорите «автоматически обнаруживать переполнение», что именно вы имеете в виду? Обнаружение переполнения как инструмента отладки, то есть что-то, что прерывает нашу программу, похоже на проваленное утверждение? Или какой-нибудь постоянный механизм выполнения, который позволил бы вам изящно выявлять и обрабатывать ситуацию?

Если вы заинтересованы в этом как в инструменте отладки, вам следует обратиться к документации вашего компилятора. GCC, например, предоставляет опцию -ftrapv, которая «генерирует ловушки для переполнения со знаком при сложении, вычитании, операциях умножения» (см. опции генерации кода )

2 голосов
/ 25 апреля 2010

Я слышал об обработке исключений на основе setjmp () или longjmp () в C, но я думаю, что нет никакого собственного способа сделать это.Что я обычно делаю, это просто проверяю, чтобы используемые типы были достаточно длинными, чтобы в них содержались все сложения / умножения, которые мне нужно сделать.

Весь смысл использования C, в отличие от управляемых языков, таких как C #,что вызовет OverflowException, это именно тот факт, что мощность процессора не теряется на проверки безопасности.C просто повернет счетчик и перейдет от FFFFFFFF к 00000000, так что вы можете проверить это (если a> b и тому подобное), но кроме этого я могу просто порекомендовать использовать более длинные типы.64 бита (длинные) должны отвечать всем вашим потребностям.

Переполнение не произойдет, когда вы печатаете число с помощью printf, или, по крайней мере, я не слышал о такой возможности.Для дополнений я бы просто использовал адекватные типы и сообщал компилятору, как интерпретировать значения, чтобы избежать ненужных приведений (например, литерал «123» будет интерпретироваться как 32-разрядный, но «123LL» будет 64-разрядным -То же самое, что и ".1f" против ".1").

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

Что касается того, когда целочисленное переполнение должно быть проверено на ... Хорошо, когда это может произойти, и вы не хотите, чтобы это произошло:).

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