From 56a5ac94b19cdb236a7d75d337a8566e4eb58329 Mon Sep 17 00:00:00 2001 From: Christopher Jones Date: Tue, 18 Aug 2020 16:11:20 -0500 Subject: [PATCH] Fix undefined behavior in EgammaTowerIsolation Avoid doing iterator arithmetic on an empty container. --- .../interface/EgammaTowerIsolation.h | 11 ++++++----- .../EgammaIsolationAlgos/src/EgammaTowerIsolation.cc | 11 ++++++----- .../EgammaIsolationAlgos/test/EgammaTowerIso_t.cpp | 3 ++- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h index b47b9763edad6..078efb9f6bbe1 100644 --- a/RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h +++ b/RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h @@ -53,13 +53,13 @@ class EgammaTowerIsolationNew { ~EgammaTowerIsolationNew() { delete[] mem; } - void compute( - bool et, Sum& sum, reco::Candidate const& cand, CaloTowerDetId const* first, CaloTowerDetId const* last) const { + template + void compute(bool et, Sum& sum, reco::Candidate const& cand, I first, I last) const { reco::SuperCluster const& sc = *cand.get().get(); return compute(et, sum, sc, first, last); } - void compute( - bool et, Sum& sum, reco::SuperCluster const& sc, CaloTowerDetId const* first, CaloTowerDetId const* last) const; + template + void compute(bool et, Sum& sum, reco::SuperCluster const& sc, I first, I last) const; void setRadius(float const extRadius[NC], float const intRadius[NC]) { for (std::size_t i = 0; i != NCuts; ++i) { @@ -153,8 +153,9 @@ inline EgammaTowerIsolationNew::EgammaTowerIsolationNew(float extRadius[NC], } template +template inline void EgammaTowerIsolationNew::compute( - bool et, Sum& sum, reco::SuperCluster const& sc, CaloTowerDetId const* first, CaloTowerDetId const* last) const { + bool et, Sum& sum, reco::SuperCluster const& sc, I first, I last) const { if (nt == 0) return; diff --git a/RecoEgamma/EgammaIsolationAlgos/src/EgammaTowerIsolation.cc b/RecoEgamma/EgammaIsolationAlgos/src/EgammaTowerIsolation.cc index 2fb5dfb2b89f6..f7e9c99b11ab2 100644 --- a/RecoEgamma/EgammaIsolationAlgos/src/EgammaTowerIsolation.cc +++ b/RecoEgamma/EgammaIsolationAlgos/src/EgammaTowerIsolation.cc @@ -58,11 +58,12 @@ double EgammaTowerIsolation::getSum(bool et, tls.newAlgo->setRadius(&extRadius, &intRadius); EgammaTowerIsolationNew<1>::Sum sum; - tls.newAlgo->compute(et, - sum, - sc, - (detIdToExclude == nullptr) ? nullptr : &((*detIdToExclude).front()), - (detIdToExclude == nullptr) ? nullptr : (&(*detIdToExclude).back()) + 1); + if (detIdToExclude == nullptr) { + tls.newAlgo->compute( + et, sum, sc, static_cast(nullptr), static_cast(nullptr)); + } else { + tls.newAlgo->compute(et, sum, sc, detIdToExclude->cbegin(), detIdToExclude->cend()); + } switch (depth_) { case AllDepths: diff --git a/RecoEgamma/EgammaIsolationAlgos/test/EgammaTowerIso_t.cpp b/RecoEgamma/EgammaIsolationAlgos/test/EgammaTowerIso_t.cpp index 7f79769579244..8693427f284f6 100644 --- a/RecoEgamma/EgammaIsolationAlgos/test/EgammaTowerIso_t.cpp +++ b/RecoEgamma/EgammaIsolationAlgos/test/EgammaTowerIso_t.cpp @@ -9,7 +9,8 @@ int main() { CaloTower cand; EgammaTowerIsolationNew<2>::Sum sum; - iso.compute(true, sum, cand, nullptr, nullptr); + iso.compute( + true, sum, cand, static_cast(nullptr), static_cast(nullptr)); return 0; }