Существует открытый проект 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;
}
Мы столкнулись с простой и в то же время ужасной ошибкой: неинициализированная переменная.
Этот алгоритм может посчитать что угодно.
Собственно, это все.
Здесь нечего объяснять.
Остается лишь еще раз подчеркнуть, что разработчики научных библиотек и научных приложений должны прилагать дополнительные усилия для обеспечения качества своего кода.
Крах обычного приложения, скорее всего, обойдется гораздо дешевле, чем использование неверных результатов расчетов в научных, медицинских и других целях.
Это не первая наша статья на эту тему:
- Code Analysis ROOT — платформа для анализа данных научных исследований.
- NCBI Genome Workbench: исследования под угрозой
- Большой калькулятор выходит из-под контроля
Спасибо за внимание.
Если вы хотите поделиться этой статьей с англоязычной аудиторией, воспользуйтесь ссылкой для перевода: Андрей Карпов.
Исследование COVID-19 и неинициализированная переменная .
Теги: #ошибки #программирование #открытый исходный код #вычисления #covid-19 #c++ #C++ #Идеальный код #доверие #c #статический анализ кода #pvs-studio #неинициализированная переменная #COVID-19 Модель CovidSim #Модель CovidSim #COVID -19 КовидСим
-
Знайте, Откуда Приходят Ваши Посетители
19 Oct, 24 -
Как Программисту Переехать В Нидерланды?
19 Oct, 24 -
Скрипт Для Импорта Истории Qutim Из Kopete
19 Oct, 24 -
10 Самых Богатых Людей В Истории
19 Oct, 24