From a14f13a281396e3f40dc407be969577dd4d75069 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 12 Mar 2015 11:51:51 +0000 Subject: [PATCH] fix coverity 1076262-64 (dynamic_cast checks), re #11328 --- .../WorkflowAlgorithms/src/EQSANSLoad.cpp | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/Code/Mantid/Framework/WorkflowAlgorithms/src/EQSANSLoad.cpp b/Code/Mantid/Framework/WorkflowAlgorithms/src/EQSANSLoad.cpp index f63e615b41f3..5979526d9cf6 100644 --- a/Code/Mantid/Framework/WorkflowAlgorithms/src/EQSANSLoad.cpp +++ b/Code/Mantid/Framework/WorkflowAlgorithms/src/EQSANSLoad.cpp @@ -106,6 +106,10 @@ double getRunPropertyDbl(MatrixWorkspace_sptr inputWS, Mantid::Kernel::Property *prop = inputWS->run().getProperty(pname); Mantid::Kernel::PropertyWithValue *dp = dynamic_cast *>(prop); + if (!dp) { + throw std::runtime_error("Could not cast (interpret) the property " + + pname + " as a floating point numeric value."); + } return *dp; } @@ -243,10 +247,11 @@ void EQSANSLoad::readSourceSlitSize(const std::string &line) { num_str = posVec[3]; boost::regex re_size("\\w*?([0-9]+)mm"); int slit_size = 0; - boost::regex_search(num_str, posVec, re_size); - if (posVec.size() == 2) { - num_str = posVec[1]; - Poco::NumberParser::tryParse(num_str, slit_size); + if (boost::regex_search(num_str, posVec, re_size)) { + if (posVec.size() == 2) { + num_str = posVec[1]; + Poco::NumberParser::tryParse(num_str, slit_size); + } } m_slit_positions[wheel_number][slit_number] = slit_size; } @@ -262,17 +267,35 @@ void EQSANSLoad::getSourceSlitSize() { return; } - Mantid::Kernel::Property *prop = dataWS->run().getProperty("vBeamSlit"); + const std::string slit1Name = "vBeamSlit"; + Mantid::Kernel::Property *prop = dataWS->run().getProperty(slit1Name); Mantid::Kernel::TimeSeriesProperty *dp = dynamic_cast *>(prop); + if (!dp) { + throw std::runtime_error("Could not cast (interpret) the property " + + slit1Name + " as a time series property with " + "floating point values."); + } int slit1 = (int)dp->getStatistics().mean; - prop = dataWS->run().getProperty("vBeamSlit2"); + const std::string slit2Name = "vBeamSlit2"; + prop = dataWS->run().getProperty(slit2Name); dp = dynamic_cast *>(prop); + if (!dp) { + throw std::runtime_error("Could not cast (interpret) the property " + + slit2Name + " as a time series property with " + "floating point values."); + } int slit2 = (int)dp->getStatistics().mean; - prop = dataWS->run().getProperty("vBeamSlit3"); + const std::string slit3Name = "vBeamSlit3"; + prop = dataWS->run().getProperty(slit3Name); dp = dynamic_cast *>(prop); + if (!dp) { + throw std::runtime_error("Could not cast (interpret) the property " + + slit3Name + " as a time series property with " + "floating point values."); + } int slit3 = (int)dp->getStatistics().mean; if (slit1 < 0 && slit2 < 0 && slit3 < 0) { @@ -527,9 +550,15 @@ void EQSANSLoad::exec() { throw std::invalid_argument( "Could not determine Z position: stopping execution"); } - Mantid::Kernel::Property *prop = dataWS->run().getProperty("detectorZ"); + + const std::string dzName = "detectorZ"; + Mantid::Kernel::Property *prop = dataWS->run().getProperty(dzName); Mantid::Kernel::TimeSeriesProperty *dp = dynamic_cast *>(prop); + if (!dp) { + throw std::runtime_error("Could not cast (interpret) the property " + + dzName + " as a time series property value."); + } sdd = dp->getStatistics().mean; // Modify SDD according to offset if given