Penelitian COVID-19 dan variabel yang tidak diinisialisasi

0796_covid_sim_ru / image1.png







Ada proyek sumber terbuka Model CovidSim COVID-19 yang ditulis dalam C ++. Ada penganalisis kode statis PVS-Studio, yang pandai menemukan kesalahan. Suatu hari mereka bertemu. Pelajari kerapuhan algoritme pemodelan matematika dan mengapa Anda perlu berusaha semaksimal mungkin untuk kualitas kode program.







Suatu hari saya perlu menemukan sesuatu di GitHub, yang merupakan awal dari cerita kecil ini. Saat mempelajari hasil pencarian, saya tidak sengaja menemukan proyek Model CovidSim COVID-19 . Tanpa berpikir dua kali, saya memutuskan untuk memeriksanya menggunakan penganalisis PVS-Studio.







Proyek itu ternyata sangat kecil. Ini hanya memiliki 13.000 baris kode, tidak termasuk baris kosong dan komentar. Dan hampir tidak ada kesalahan di sana. Tapi satu kesalahan begitu sederhana dan indah yang tidak bisa saya lewatkan!







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