Pesquisa COVID-19 e variável não inicializada

0796_covid_sim_ru / image1.png







Existe um projeto de código aberto COVID-19 CovidSim Model escrito em C ++. Existe um analisador de código estático PVS-Studio, que é bom para encontrar erros. Um dia eles se conheceram. Aprenda a fragilidade dos algoritmos de modelagem matemática e por que você precisa colocar o máximo esforço na qualidade do código do programa.







Outro dia precisei encontrar algo no GitHub, que é o início desta pequena história. Ao estudar os resultados da pesquisa, acidentalmente me deparei com o projeto do modelo COVID-19 CovidSim . Sem pensar duas vezes, decidi verificar usando o analisador PVS-Studio.







O projeto acabou sendo muito pequeno. Possui apenas 13.000 linhas de código, sem contar linhas em branco e comentários. E quase não há erros lá também. Mas um erro é tão simples e bonito que não posso ignorar!







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