C ++で書かれたオープンソースプロジェクトCOVID-19CovidSimモデルがあります。エラーを見つけるのに優れた静的コードアナライザーPVS-Studioがあります。ある日彼らは出会った。数学的モデリングアルゴリズムの脆弱性と、プログラムコードの品質に最大限の努力を払う必要がある理由を学びます。
先日、この小さな話の始まりであるGitHubで何かを見つける必要がありました。検索結果を調べているときに、偶然にCOVID-19 CovidSimModelプロジェクトに出くわしました。よく考えずに、PVS-Studioアナライザーで確認することにしました。
プロジェクトは非常に小さいことが判明しました。空白行やコメントを除いて、コードは13,000行しかありません。そして、そこにもほとんど間違いはありません。しかし、1つの間違いはとても単純で美しいので、私は通り過ぎることができません!
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.