
Es gibt ein Open-Source-Projekt COVID-19 CovidSim Model, das in C ++ geschrieben wurde. Es gibt einen statischen Code-Analysator PVS-Studio, der Fehler gut finden kann. Eines Tages trafen sie sich. Erfahren Sie, wie fragil mathematische Modellierungsalgorithmen sind und warum Sie maximale Anstrengungen in die Qualität des Programmcodes investieren müssen.
Neulich musste ich etwas auf GitHub finden, was der Anfang dieser kleinen Geschichte ist. Beim Studium der Suchergebnisse bin ich versehentlich auf das COVID-19 CovidSim Model- Projekt gestoßen . Ohne nachzudenken, entschied ich mich, es mit dem PVS-Studio-Analysegerät zu überprüfen.
Das Projekt erwies sich als sehr klein. Es hat nur 13.000 Codezeilen, ohne Leerzeilen und Kommentare. Und auch dort gibt es fast keine Fehler. Aber ein Fehler ist so einfach und schön, dass ich nicht vorbeikommen kann!
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.