Предупреждение о переполнении возвращаемого значения в Coverity - PullRequest
2 голосов
/ 23 марта 2012

Я получаю предупреждение инструмента проверки статичности для кода ниже.

   double value = 0;
   std::string origValue("0.50");
   value = 0.10 * boost::lexical_cast<double>(origValue);

Предупреждение «Переполненное возвращаемое значение (INTEGER_OVERFLOW)». Я не могу понять, что не так с кодом выше. И как происходит переполнение целых чисел, когда я использую двойные числа? Спасибо.

1 Ответ

6 голосов
/ 26 марта 2012

Эта конкретная программа проверки статического анализа Coverity ищет две вещи: операцию, которая может переполниться для определенных значений (примеры которых она будет пытаться привести в объяснении) и небезопасное использование потенциально усеченного значения.

Пользовательский интерфейс показывает вам «события», которые объясняют, почему что-то было помечено.Руководство описывает, что означает каждое событие.В вашем случае вы ищете два события: «усечение» или «переполнение» для первого события и «слив переполнения» для второго события.

Фрагмент кода показывает, что строка, преобразованная в двойное число, являетсяумножается на константу, а затем присваивается еще один дубль.Возможно, здесь нет никаких проблем, однако заголовок дефекта «Переполненное возвращаемое значение» говорит нам, что у вас есть второе событие, когда вы возвращаете это значение из этой функции.Если вы возвращаете «значение» из этой функции, и тип возвращаемого значения не является двойным (может быть, это 32-разрядный тип), то в вашем коде есть потенциальная ошибка (явно не с конкретными значениями, которые вы показываете, но если строка можетбыть гораздо большей ценностью).Если функция возвращает значение double, то это ложный положительный результат в анализе, и вы можете пометить его как таковой в пользовательском интерфейсе, чтобы дефект больше не показывался вам.

Не видя больше кодаТрудно сказать, существует ли реальная проблема или нет, но помните, что статический анализ не может знать, какие значения времени выполнения (действительно ли строка постоянна или она читается динамически?), но именно поэтому он дает вам подробные события, а не просто однострочная сводка - так что вы можете оценить вероятность реальной проблемы, возникающей в этом коде.

С учетом всего этого, программа проверки не должна отслеживать операции с плавающей точкой, поэтому определенно есть ошибка вПокрытие здесь.Так как мне довелось работать на них, я подал это как проблему, но не стесняйтесь сообщать об этом и в службу поддержки Coverity.

...