
Il existe un projet open source COVID-19 CovidSim Model écrit en C ++. Il existe un analyseur de code statique PVS-Studio, qui est bon pour trouver des erreurs. Un jour, ils se sont rencontrés. Apprenez la fragilité des algorithmes de modélisation mathématique et pourquoi vous devez consacrer un maximum d'efforts à la qualité du code du programme.
L'autre jour, j'avais besoin de trouver quelque chose sur GitHub, qui est le début de cette petite histoire. En étudiant les résultats de la recherche, je suis tombé accidentellement sur le projet COVID-19 CovidSim Model . Sans réfléchir à deux fois, j'ai décidé de le vérifier à l'aide de l'analyseur PVS-Studio.
Le projet s'est avéré être très petit. Il ne comporte que 13 000 lignes de code, sans compter les lignes vides et les commentaires. Et il n'y a presque pas d'erreurs là non plus. Mais une erreur est si simple et si belle que je ne peux passer à côté!
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.