From 5c8d4a04370e2d5d43bf811f9737814ff75b237b Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Thu, 18 Jan 2024 16:21:06 -0600 Subject: [PATCH] Fixed UBSAN warning in FieldHandler The report was most likely false but the code changes were useful. --- .../GMTConfigProducers/interface/RecordHelper.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/L1TriggerConfig/GMTConfigProducers/interface/RecordHelper.h b/L1TriggerConfig/GMTConfigProducers/interface/RecordHelper.h index 8732a7a4486fa..a2ac622ca74ef 100644 --- a/L1TriggerConfig/GMTConfigProducers/interface/RecordHelper.h +++ b/L1TriggerConfig/GMTConfigProducers/interface/RecordHelper.h @@ -13,7 +13,7 @@ */ -#include +#include #include "RelationalAccess/ICursor.h" #include "CoralBase/AttributeList.h" @@ -30,6 +30,7 @@ class FieldHandlerBase { typedef coral::AttributeList AttributeList; /** Construct a new field handler with the C++ field name as its argument */ FieldHandlerBase(const std::string& name) : name_(name) {} + FieldHandlerBase() = delete; /** Return the name of the field handled by this object. */ const std::string& getName() { return name_; } @@ -64,14 +65,16 @@ class FieldHandler : public FieldHandlerBase { FieldHandler(const std::string& fieldName, TSetMethod setter) : FieldHandlerBase(fieldName), setter_(setter) {} + FieldHandler() = delete; + /** Actual data extraction. */ void extractValue(const AttributeList& src, TOutput& dest) override { #ifdef RECORDHELPER_DEBUG std::cout << "Parsing field " << this->getName() << " with type " << typeid(TCField).name(); #endif - typedef typename boost::remove_cv::type>::type TDBFieldT; + typedef typename std::remove_cv::type>::type TDBFieldT; const TDBFieldT& value = src[this->getColumnName()].template data(); - ((dest).*setter_)(TCField(value)); + call(dest, TCField(value)); #ifdef RECORDHELPER_DEBUG std::cout << "=" << TCField(value) << std::endl; @@ -79,9 +82,10 @@ class FieldHandler : public FieldHandlerBase { } protected: + void call(TOutput& dest, const TCField value) { ((dest).*setter_)(value); } /** Points to the setter method used to stuff the field's value into the destination object. */ - TSetMethod setter_; + TSetMethod setter_ = nullptr; }; /** A special handler for bool fields in the GT/GMT DBs. These can't be imported @@ -96,13 +100,15 @@ class ASCIIBoolFieldHandler : public FieldHandler { ASCIIBoolFieldHandler(const std::string& fieldName, typename FieldHandler::TSetMethod setter) : FieldHandler(fieldName, setter) {} + ASCIIBoolFieldHandler() = delete; + /** Extract value as char, then see compare it to '0' to get its truth value. */ void extractValue(const AttributeList& src, TOutput& dest) override { char value = src[this->getColumnName()].template data(); #ifdef RECORDHELPER_DEBUG std::cout << " .. and " << this->getColumnName() << " is (in integers) " << (int)value << std::endl; #endif - ((dest).*(this->setter_))(value != FalseCharacter); + this->call(dest, value != FalseCharacter); } };