
Existe um projeto de código aberto COVID-19 CovidSim Model escrito em C ++. Existe um analisador de código estático PVS-Studio, que é bom para encontrar erros. Um dia eles se conheceram. Aprenda a fragilidade dos algoritmos de modelagem matemática e por que você precisa colocar o máximo esforço na qualidade do código do programa.
Outro dia precisei encontrar algo no GitHub, que é o início desta pequena história. Ao estudar os resultados da pesquisa, acidentalmente me deparei com o projeto do modelo COVID-19 CovidSim . Sem pensar duas vezes, decidi verificar usando o analisador PVS-Studio.
O projeto acabou sendo muito pequeno. Possui apenas 13.000 linhas de código, sem contar linhas em branco e comentários. E quase não há erros lá também. Mas um erro é tão simples e bonito que não posso ignorar!
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.