Как видно из названия, существует ли способ в C для обнаружения таких ошибок? Например, если я попытаюсь выполнить сложное вычисление, например
int a=b*c+d*e/f;
, могу ли я определить, вышел ли результат за пределы диапазонаint
?Обнаружение арифметического переполнения в CПредположим, я решаю, что обработка таких ошибок происходит за счет снижения производительности, каковы последствия для безопасности и что может произойти в худшем случае? Может ли автор вредоносных программ использовать эту ошибку?
ответ
В более простом случае unsigned int
вы можете проверить на переполнение перед тем умножение, как этот выход
#include <stdio.h>
#include <limits.h>
void multiply(unsigned a, unsigned b)
{
if(UINT_MAX/a >= b)
printf("%u * %u = %u\n", a, b, a * b);
else
printf("%u * %u is out of range\n", a, b);
}
int main(void)
{
multiply(70000, 60000);
multiply(70000, 80000);
return 0;
}
программы:
70000 * 60000 = 4200000000
70000 * 80000 is out of range
И вы можете использовать более обширные тесты для int
Реально, ответ на ваш первый вопрос - нет. Вы можете делать проверки для простых операций, но для более крупных проверок быстро становятся трудными. Типы данных и примитивы, такие как int
, определяются только для обработки конечного диапазона значений. Если вы беспокоитесь о переполнении, простой ответ заключается в использовании более крупного типа данных (то есть int64_t
и т. Д.).
Чтобы ответить на ваш последний вопрос, это зависит от контекста. Если навигационное программное обеспечение космического челнока столкнулось с переполнением в правой части его вычислений, это может привести к неуклонному изменению курса и сбою. То, что я получаю, это то, что технически все может случиться, и очень сложно быть «полностью» безопасным. Хеджируйте свои ставки и убедитесь, что у них нет переполнения, используя подходящие типы данных. Это помогает найти границы возможных входных значений и использовать их в качестве руководства, но если границы действительно не применимы, вы можете просто использовать самые доступные типы. uint64_t
может обрабатывать положительные целые числа до 1,8446744e + 19 ... который огромен.
- 1. Как работает проверка арифметического переполнения в C#
- 2. Ошибка арифметического переполнения -802
- 3. Ошибка арифметического переполнения в SQL
- 4. обнаружение переполнения строк в C
- 5. автоматическое обнаружение переполнения в C++?
- 6. Ошибка преобразования арифметического переполнения datetime
- 7. Ошибка арифметического переполнения для smalldatetime
- 8. Обнаружение переполнения
- 9. арифметического переполнения при использовании atoi() в ARGV [1] в C
- 10. Ошибка арифметического переполнения для типа money
- 11. Как избежать ошибок арифметического переполнения в Swift?
- 12. Ошибка преобразования арифметического переполнения в int
- 13. Ошибка арифметического переполнения в десятичном поле
- 14. Ошибка арифметического переполнения в SQL Server
- 15. NEON Обнаружение переполнения
- 16. SQL ROUND - Какова фактическая причина арифметического переполнения?
- 17. Избегайте арифметического переполнения по совокупной функции
- 18. Чтение из ODBC-читателя - Исключение арифметического переполнения
- 19. TSQL String Конкатенация Ошибка арифметического переполнения
- 20. Исключение арифметического переполнения при открытии SQL-соединения
- 21. Ошибка арифметического переполнения ... Пожалуйста, помогите. SQL
- 22. Ошибка арифметического переполнения для типа междунара
- 23. арифметического исключения, числовое переполнения или строка усечения
- 24. Обнаружение целочисленного переполнения
- 25. Целочисленное обнаружение переполнения C# для добавления
- 26. Сборка, обнаружение переполнения
- 27. Пользовательское обнаружение переполнения
- 28. Обнаружение переполнения CSS Media
- 29. Обнаружение переполнения содержимого в CSS
- 30. Обнаружение переполнения в поле ввода
1) № 2) Да, а также не имеет смысла спрашивать о поведении неопределенного поведения. Вы можете сделать правильную программу быстро, но очень сложно сделать быструю программу правильной. –
Возможный дубликат http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-cc – Ctx
@KerrekSB Итак, вы на самом деле хотите сказать, что я беспомощен, если захочу сделать программу это «арифметическое переполнение»? Я имею в виду, что я готов сделать все, чтобы программа была надежной. –