COVID-19研究と初期化されていない変数

0796_covid_sim_ru / image1.png







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.








All Articles