2016-01-11 4 views
2
  1. Как видно из названия, существует ли способ в C для обнаружения таких ошибок? Например, если я попытаюсь выполнить сложное вычисление, например int a=b*c+d*e/f;, могу ли я определить, вышел ли результат за пределы диапазона int?Обнаружение арифметического переполнения в C

  2. Предположим, я решаю, что обработка таких ошибок происходит за счет снижения производительности, каковы последствия для безопасности и что может произойти в худшем случае? Может ли автор вредоносных программ использовать эту ошибку?

+1

1) № 2) Да, а также не имеет смысла спрашивать о поведении неопределенного поведения. Вы можете сделать правильную программу быстро, но очень сложно сделать быструю программу правильной. –

+0

Возможный дубликат http://stackoverflow.com/questions/199333/how-to-detect-integer-overflow-in-cc – Ctx

+1

@KerrekSB Итак, вы на самом деле хотите сказать, что я беспомощен, если захочу сделать программу это «арифметическое переполнение»? Я имею в виду, что я готов сделать все, чтобы программа была надежной. –

ответ

1

В более простом случае 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

1

Реально, ответ на ваш первый вопрос - нет. Вы можете делать проверки для простых операций, но для более крупных проверок быстро становятся трудными. Типы данных и примитивы, такие как int, определяются только для обработки конечного диапазона значений. Если вы беспокоитесь о переполнении, простой ответ заключается в использовании более крупного типа данных (то есть int64_t и т. Д.).

Чтобы ответить на ваш последний вопрос, это зависит от контекста. Если навигационное программное обеспечение космического челнока столкнулось с переполнением в правой части его вычислений, это может привести к неуклонному изменению курса и сбою. То, что я получаю, это то, что технически все может случиться, и очень сложно быть «полностью» безопасным. Хеджируйте свои ставки и убедитесь, что у них нет переполнения, используя подходящие типы данных. Это помогает найти границы возможных входных значений и использовать их в качестве руководства, но если границы действительно не применимы, вы можете просто использовать самые доступные типы. uint64_t может обрабатывать положительные целые числа до 1,8446744e + 19 ... который огромен.

Смежные вопросы