Hay un proyecto de código abierto COVID-19 CovidSim Model escrito en C ++. Hay un analizador de código estático PVS-Studio, que es bueno para encontrar errores. Un día se conocieron. Conozca la fragilidad de los algoritmos de modelado matemático y por qué debe esforzarse al máximo en la calidad del código del programa.
El otro día necesitaba encontrar algo en GitHub, que es el comienzo de esta pequeña historia. Mientras estudiaba los resultados de la búsqueda, me encontré accidentalmente con el proyecto del modelo COVID-19 CovidSim . Sin pensarlo dos veces, decidí comprobarlo con el analizador PVS-Studio.
El proyecto resultó ser muy pequeño. Tiene solo 13.000 líneas de código, sin contar las líneas en blanco y los comentarios. Y casi no hay errores allí tampoco. ¡Pero un error es tan simple y hermoso que no puedo pasar por alto!
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] Uninitialized variable 'ModelValue' used. CovidSim.cpp 5412
, :
double ModelValue;
for (int k = offset; k < day; k++)
{
double prob_seroconvert = ....;
ModelValue += c * TimeSeries[k - offset].incI * prob_seroconvert;
}
: . .
, . . , . , , , , .
:
PVS-Studio! . .
, : Andrey Karpov. COVID-19 Research and Uninitialized Variable.