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

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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам