Предупреждение о переполнении возвращаемого значения в Coverity

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

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

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


person polapts    schedule 23.03.2012    source источник
comment
Для какой строки выдается предупреждение Coverity? Единственное целое число, которое я вижу в этом фрагменте кода, — это целочисленный литерал 0, который вы присваиваете value. Что произойдет, если вы измените строку на double value = 0.0;?   -  person teukkam    schedule 23.03.2012
comment
Предупреждение выглядит так: операция умножения переполняется операндами 0.10 и boost::lexical_cast‹double›. Поэтому изменение значения на двойное не поможет.   -  person polapts    schedule 23.03.2012
comment
Может быть что-то внутри реализации Boost lexical_cast. Что произойдет, если вы измените value на long double?   -  person teukkam    schedule 23.03.2012


Ответы (1)


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

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

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

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

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

person Asya Kamsky    schedule 25.03.2012
comment
Спасибо. Функция возвращает double, поэтому я предполагаю, что это ложное срабатывание. - person polapts; 26.03.2012
comment
Да, я подтвердил, что это не следует помечать — надеюсь, это будет исправлено в будущей версии анализа. - person Asya Kamsky; 28.03.2012