Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Продолжение проверки Geant4

Anna | 24.06.2014 | нет комментариев

Написал верную статья про проверку плана Geant4. Напомню предысторию. Незадолго была проверена ветхая версия библиотеки Geant4 и написана статья “Copy-Paste и мюоны“. Отчего была проверена ветхая версия? Люди не идеальны. Суть оплошности дозволено узнать в предыдущей статье. Сейчас же вашему вниманию предлагается короткий отчет о проверке Geant4 версии 10.0-beta.

Короткое оглавление предыдущей статьи

В статье «Copy-Paste и мюоны» рассказывается о пользе применения методики статического обзора и вероятностях PVS-Studio. Был проверен бородатый план Geant4 версии 4.9.4. Было обнаружено уйма подозрительных фрагментов кода, которые и были описаны статье.

Geant4 это программа для моделирования прохождения элементарных частиц через вещество с применением способов Монте-Карло. Разработана в CERN на объектно-ориентированном языке программирования С . Является последующим становлением предыдущих версий GEANT, значительно переработанным и дополненным.

Сайт плана: http://geant4.org.

В предыдущей статье было описано 16 весьма подозрительных фрагментов кода. Новая проверка выявила только 10 из них. Остальные видимо либо поправлены, либо этого кода огромнее не существует. Я не буду опять описывать в новой статье эти фрагменты кода. Их дозволено увидеть в предыдущей статье. В ней помечено, исчезло предупреждение анализатора либо нет в новой версии.

Умоляю помилования, что получился такой необычный формат изыскания. Но верю, это не помешает поправить ряд недочетов в плане Geant4 и привлечь внимание людей к инструменту PVS-Studio.

Если я не заблуждаюсь, предыдущая версия библиотеки относится к 2011 году. За это время многое изменилось, и не восхитительно, что обнаружены некоторые новые необычные места в коде. Давайте посмотрим, что есть новенького либо то, что я не подметил ранее.

Новые подозрительные фрагменты кода

Полный список подозрительных мест, на которые я обратил внимание, находится в файле geant4_new.txt. Хочу подчеркнуть, что не стоит полагаться экстраординарно на данный список. Гораздо отменнее, будет проверить план самосильно и проанализировать все предупреждения. Мы готовы предоставить для этого на некоторое время ключ разработчикам Geant4: форма обратной связи.

Идентичные функции

G4double G4CsvAnalysisManager::GetH2Xmin(G4int /*id*/) const
{
  ExceptionForHistograms("GetH2Xmin");
  return 0;
}

G4double G4CsvAnalysisManager::GetH2Xmax(G4int /*id*/) const
{
  ExceptionForHistograms("GetH2Xmin");
  return 0;
}

Предупреждение PVS-Studio: V524 It is odd that the body of ‘GetH2Xmax’ function is fully equivalent to the body of ‘GetH2Xmin’ function. _G4analysis-archive g4csvanalysismanager.cc 933

Функция GetH2Xmax(), по каждой видимости, должна вызывать функция ExceptionForHistograms() с иным параметром:

ExceptionForHistograms("GetH2Xmax");

Оплошность не выглядит серьезной. Как я понимаю, это обработка исключительной обстановки. Тем не менее, решил упомянуть об этой Copy-Paste ошибке.

Энергия равна нулю

Функции CalculateTotalEnergy () суммирует значения в переменной ‘Etot’. Невзначай, эта переменная обнуляется. Это дюже сомнительно.

G4double G4RKFieldIntegrator::CalculateTotalEnergy(const G4KineticTrackVector& Barions)
{
  G4double Etot = 0;
  ....
  for(G4int c2 = c1   1; c2 < nBarion; c2  )
  {  
    ....
    //  Esk2
    Etot  = t1*std::pow(Alpha/pi, 3/2)*
            std::exp(-Alpha*r12*r12);

    // Eyuk
    Etot  = ....;

    // Ecoul
    Etot  = 1.44*p1->GetDefinition()->GetPDGCharge()*
            p2->GetDefinition()->GetPDGCharge()/r12*
            Erf(std::sqrt(Alpha)*r12);

    // Epaul
    Etot = 0;
    ....
  }
  ....
}

Предупреждение PVS-Studio: V519 The ‘Etot’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 80, 83. _G4processes-archive g4rkfieldintegrator.cc 83

Подозрительная логика

G4double 
G4EmBiasingManager::ApplySecondaryBiasing(....)
{
  ....
  if(0 == nsplit) { 
    if(safety > fSafetyMin) ....
  } if(1 == nsplit) { 
    weight = ApplyRussianRoulette(vd, index);
  } else {
    G4double tmpEnergy = pPartChange->GetProposedKineticEnergy();
    G4ThreeVector tmpMomDir = ....
    weight = ApplySplitting(vd, track, currentModel, index, tcut);
    pPartChange->SetProposedKineticEnergy(tmpEnergy);
    pPartChange->ProposeMomentumDirection(tmpMomDir);
  }
  ....
}

Предупреждение PVS-Studio: V646 Consider inspecting the application’s logic. It’s possible that ‘else’ keyword is missing. _G4processes-archive g4embiasingmanager.cc 299

Код оформлен так, как словно применяется конструкция «else if». Но это не так. Если оформить код верно, то получим вот это:

if(0 == nsplit) { 
  if(safety > fSafetyMin) ....
}

if(1 == nsplit) { 
  weight = ApplyRussianRoulette(vd, index);
} else {
  G4double tmpEnergy = pPartChange->GetProposedKineticEnergy();
  G4ThreeVector tmpMomDir = ....
  weight = ApplySplitting(vd, track, currentModel, index, tcut);
  pPartChange->SetProposedKineticEnergy(tmpEnergy);
  pPartChange->ProposeMomentumDirection(tmpMomDir);
}

Обратите внимание, что блок, относящийся к ветке ‘else’ выполняется неизменно, если «1 != nsplit». Есть сомнение, что задумывалась другая логика работы.

Аналогичную обстановку дозволено увидеть тут:

V646 Consider inspecting the application’s logic. It’s possible that ‘else’ keyword is missing. _G4processes-archive g4embiasingmanager.cc 347

Недописанный код?

void G4MolecularDecayTable::AddExcitedState(const G4String& label)
{
  channelsMap::iterator channelsIter =
    fDecayChannelsMap.find(label);
  if(channelsIter != fDecayChannelsMap.end())
  {
    G4String errMsg = "Excited state"   label  
                      " already registered in the decay table.";
    G4Exception("G4MolecularDecayTable::AddExcitedState",
                "G4MolecularDecayTable003",
                FatalErrorInArgument, errMsg);
     return;
  }
  fDecayChannelsMap[label] ;
}

Предупреждение PVS-Studio: V607 Ownerless expression ‘fDecayChannelsMap[label]‘. _G4processes-archive g4moleculardecaytable.cc 140

Конец функции выглядит дюже сомнительно:

fDecayChannelsMap[label] ;

Что это? Тут чего-то не хватает? Что хотели сделать с ячейкой массива?

Кинематика

Дальнейший пример довольно длинный. К сожалению, мне сложно сократить его ещё огромнее. Посмотрите, какие значения может принимать переменная ‘id’.

void G4QMDCollision::CalKinematicsOfBinaryCollisions(
  G4double dt)
{
  ....
  G4int id = 0;
  ....
  if ( secs )
  {
    ....
    id  ;
    ....
  }
  if ( std::abs ( eini - efin ) < fepse*10 ) 
    ....
  else
  {  
    ....             
    for ( G4int i0i = 0 ; i0i < id-1 ; i0i   )
    {
      theSystem->DeleteParticipant( i0i n0 );
    }
    ....
  }
  ....
}

Предупреждение PVS-Studio: V621 Consider inspecting the ‘for’ operator. It’s possible that the loop will be executed incorrectly or won’t be executed at all. _G4processes-archive g4qmdcollision.cc 228

Если условие «if ( secs )» не выполнится, то переменная ‘id’ останется равна нулю. Тогда, может появиться цикл вида:

for ( G4int i0i = 0 ; i0i < -1 ; i0i   )

Это будет дюже необычный цикл. Думаю, стоит проверить логику работы функции CalKinematicsOfBinaryCollisions().

Другое

Есть ещё ряд предупреждений, которые я не описывал в прошлой статье. Не буду и в этой. Для примера, покажу один случай:

class G4HadronicException : public std::exception
{
  ....
};

inline G4double G4GeneralPhaseSpaceDecay::Pmx(
  G4double e, G4double p1, G4double p2)
{
   if (e-p1-p2 < 0 )
   {  
    G4HadronicException(__FILE__, __LINE__,
      "G4GeneralPhaseSpaceDecay::Pmx "
      "energy in cms > mass1 mass2");
   }
  ....
}

Предупреждение PVS-Studio. V596 The object was created but it is not being used. The ‘throw’ keyword could be missing: throw G4HadronicException(FOO); _G4processes-archive g4generalphasespacedecay.hh 116

Есть несколько ошибок, когда позабыт оператор ‘throw’. В итоге, создаётся и здесь же уничтожается объект, имеющий тип ‘G4HadronicException’. И дальше программа продолжает трудиться с некорректными данными.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB