Исследование Covid-19 И Неинициализированная Переменная



Исследование COVID-19 и неинициализированная переменная

Существует открытый проект Covid-19 CovidSim Model, написанный на C++.

Есть статический анализатор кода PVS-Studio, который хорошо находит ошибки.

Однажды они встретились.

Поймите хрупкость алгоритмов математического моделирования и почему вам нужно приложить все усилия для обеспечения качества кода.

На днях мне нужно было найти кое-что на GitHub, и это начало этой маленькой истории.

Изучая результаты поиска, случайно наткнулся на проект Модель CovidSim от COVID-19 .

Недолго думая, я решил проверить это с помощью анализатора PVS-Studio. Проект оказался совсем крошечным.

Это всего 13 000 строк кода, не считая пустых строк и комментариев.

И ошибок там тоже почти нет. Но одна ошибка настолько проста и прекрасна, что я не могу ее игнорировать!

  
   

void CalcLikelihood(int run, std::string const& DataFile, std::string const& OutFileBase) { .

double m = Data[row][col]; // numerator double N = Data[row][col + 1]; // denominator double ModelValue; // loop over all days of infection up to day of sample for (int k = offset; k < day; k++) { // add P1 to P2 to prevent degeneracy double prob_seroconvert = P.SeroConvMaxSens * (1.0 - 0.5 * ((exp(-((double)(_I64(day) - k)) * P.SeroConvP1) + 1.0) * exp(-((double)(_I64(day) - k)) * P.SeroConvP2))); ModelValue += c * TimeSeries[k - offset].

incI * prob_seroconvert; } ModelValue += c * TimeSeries[day - offset].

S * (1.0 - P.SeroConvSpec); ModelValue /= ((double)P.PopSize); // subtract saturated likelihood LL += m * log((ModelValue + 1e-20) / (m / N + 1e-20)) + (N - m) * log((1.0 - ModelValue + 1e-20) / (1.0 - m / N + 1e-20)); .

}

Серьезный научный код. Что-то имеет значение.

Формулы.

Все выглядит продуманно и основательно.

Но все эти расчеты сбиваются из-за невнимательности человека.

Хорошо, что анализатор кода PVS-Studio может прийти на помощь и указать на ошибку: V614 [CWE-457] Используется неинициализированная переменная ModelValue. CovidSim.cpp 5412 И действительно, давайте посмотрим на это повнимательнее:

double ModelValue; for (int k = offset; k < day; k++) { double prob_seroconvert = .

; ModelValue += c * TimeSeries[k - offset].

incI * prob_seroconvert; }

Мы столкнулись с простой и в то же время ужасной ошибкой: неинициализированная переменная.

Этот алгоритм может посчитать что угодно.

Собственно, это все.

Здесь нечего объяснять.

Остается лишь еще раз подчеркнуть, что разработчики научных библиотек и научных приложений должны прилагать дополнительные усилия для обеспечения качества своего кода.

Крах обычного приложения, скорее всего, обойдется гораздо дешевле, чем использование неверных результатов расчетов в научных, медицинских и других целях.

Это не первая наша статья на эту тему:

Используйте статический анализатор кода PVS-Студия ! Выгоды от своевременного обнаружения ошибок могут быть огромными.

Спасибо за внимание.

Если вы хотите поделиться этой статьей с англоязычной аудиторией, воспользуйтесь ссылкой для перевода: Андрей Карпов.

Исследование COVID-19 и неинициализированная переменная .

Теги: #ошибки #программирование #открытый исходный код #вычисления #covid-19 #c++ #C++ #Идеальный код #доверие #c #статический анализ кода #pvs-studio #неинициализированная переменная #COVID-19 Модель CovidSim #Модель CovidSim #COVID -19 КовидСим

Вместе с данным постом часто просматривают: