From 3d9ac26aa604a1ed0f839ac885f121f0f204de28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Tue, 27 Sep 2022 12:51:22 +0200
Subject: [PATCH] =?UTF-8?q?Remove=20all=20instances=20of=20the=20=E2=80=9C?=
 =?UTF-8?q?map.find(key)->second=E2=80=9D=20pattern?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This is unsafe since the find() method can return a past-the-end iterator,
which should be tested for.

Replace most instances by calls to the std::map::at() method (which throws if
the key is unknown), and which is incidentally more readable.
---
 src/ConfigFile.cc             |  2 +-
 src/DynamicModel.cc           |  2 +-
 src/DynamicModel.hh           | 16 ++++++++--------
 src/ExternalFunctionsTable.hh | 15 +++++++++------
 src/ModelTree.cc              |  4 ++--
 src/ModelTree.hh              | 12 ++++++------
 src/StaticModel.cc            |  2 +-
 src/StaticModel.hh            | 12 ++++++------
 src/SubModel.cc               | 36 +++++++++++++++++------------------
 src/macro/Environment.cc      |  2 +-
 10 files changed, 53 insertions(+), 50 deletions(-)

diff --git a/src/ConfigFile.cc b/src/ConfigFile.cc
index de1da274..7b5fb607 100644
--- a/src/ConfigFile.cc
+++ b/src/ConfigFile.cc
@@ -738,7 +738,7 @@ ConfigFile::writeCluster(ostream &output) const
              << "'ProgramConfig', '" << follower_node.second.programConfig << "', "
              << "'MatlabOctavePath', '" << follower_node.second.matlabOctavePath << "', "
              << "'OperatingSystem', '" << follower_node.second.operatingSystem << "', "
-             << "'NodeWeight', '" << (cluster_it->second.member_nodes.find(follower_node.first))->second << "', "
+             << "'NodeWeight', '" << cluster_it->second.member_nodes.at(follower_node.first) << "', "
              << "'NumberOfThreadsPerJob', " << follower_node.second.numberOfThreadsPerJob << ", ";
 
       if (follower_node.second.singleCompThread)
diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc
index 2baf93c7..b7c860c0 100644
--- a/src/DynamicModel.cc
+++ b/src/DynamicModel.cc
@@ -4130,7 +4130,7 @@ DynamicModel::substituteLeadLagInternal(AuxVarType type, bool deterministic_mode
 
   for (int used_local_var : used_local_vars)
     {
-      const expr_t value = local_variables_table.find(used_local_var)->second;
+      const expr_t value = local_variables_table.at(used_local_var);
       expr_t subst;
       switch (type)
         {
diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh
index 458de8d1..93424eb5 100644
--- a/src/DynamicModel.hh
+++ b/src/DynamicModel.hh
@@ -916,17 +916,17 @@ DynamicModel::writeParamsDerivativesFile(const string &basename) const
                        << "gp = zeros(" << equations.size() << ", " << getJacobianColsNbr() << ", " << symbol_table.param_nbr() << ");" << endl
                        << gp_output.str()
                        << "if nargout >= 3" << endl
-                       << "rpp = zeros(" << params_derivatives.find({ 0, 2 })->second.size() << ",4);" << endl
+                       << "rpp = zeros(" << params_derivatives.at({ 0, 2 }).size() << ",4);" << endl
                        << rpp_output.str()
-                       << "gpp = zeros(" << params_derivatives.find({ 1, 2 })->second.size() << ",5);" << endl
+                       << "gpp = zeros(" << params_derivatives.at({ 1, 2 }).size() << ",5);" << endl
                        << gpp_output.str()
                        << "end" << endl
                        << "if nargout >= 5" << endl
-                       << "hp = zeros(" << params_derivatives.find({ 2, 1 })->second.size() << ",5);" << endl
+                       << "hp = zeros(" << params_derivatives.at({ 2, 1 }).size() << ",5);" << endl
                        << hp_output.str()
                        << "end" << endl
                        << "if nargout >= 6" << endl
-                       << "g3p = zeros(" << params_derivatives.find({ 3, 1 })->second.size() << ",6);" << endl
+                       << "g3p = zeros(" << params_derivatives.at({ 3, 1 }).size() << ",6);" << endl
                        << g3p_output.str()
                        << "end" << endl
                        << "end" << endl;
@@ -952,19 +952,19 @@ DynamicModel::writeParamsDerivativesFile(const string &basename) const
 		     << "@inbounds begin" << endl
                      << gp_output.str()
 		     << "end" << endl
-                     << "rpp = zeros(" << params_derivatives.find({ 0, 2 })->second.size() << ",4);" << endl
+                     << "rpp = zeros(" << params_derivatives.at({ 0, 2 }).size() << ",4);" << endl
 		     << "@inbounds begin" << endl
                      << rpp_output.str()
 		     << "end" << endl
-                     << "gpp = zeros(" << params_derivatives.find({ 1, 2 })->second.size() << ",5);" << endl
+                     << "gpp = zeros(" << params_derivatives.at({ 1, 2 }).size() << ",5);" << endl
 		     << "@inbounds begin" << endl
                      << gpp_output.str()
 		     << "end" << endl
-                     << "hp = zeros(" << params_derivatives.find({ 2, 1 })->second.size() << ",5);" << endl
+                     << "hp = zeros(" << params_derivatives.at({ 2, 1 }).size() << ",5);" << endl
 		     << "@inbounds begin" << endl
                      << hp_output.str()
 		     << "end" << endl
-                     << "g3p = zeros(" << params_derivatives.find({ 3, 1 })->second.size() << ",6);" << endl
+                     << "g3p = zeros(" << params_derivatives.at({ 3, 1 }).size() << ",6);" << endl
 		     << "@inbounds begin" << endl
                      << g3p_output.str()
 		     << "end" << endl
diff --git a/src/ExternalFunctionsTable.hh b/src/ExternalFunctionsTable.hh
index 1de10d9c..39fbd67f 100644
--- a/src/ExternalFunctionsTable.hh
+++ b/src/ExternalFunctionsTable.hh
@@ -80,8 +80,9 @@ ExternalFunctionsTable::exists(int symb_id) const
 inline int
 ExternalFunctionsTable::getNargs(int symb_id) const noexcept(false)
 {
-  if (exists(symb_id))
-    return externalFunctionTable.find(symb_id)->second.nargs;
+  if (auto it = externalFunctionTable.find(symb_id);
+      it != externalFunctionTable.end())
+    return it->second.nargs;
   else
     throw UnknownExternalFunctionSymbolIDException(symb_id);
 }
@@ -89,8 +90,9 @@ ExternalFunctionsTable::getNargs(int symb_id) const noexcept(false)
 inline int
 ExternalFunctionsTable::getFirstDerivSymbID(int symb_id) const noexcept(false)
 {
-  if (exists(symb_id))
-    return externalFunctionTable.find(symb_id)->second.firstDerivSymbID;
+  if (auto it = externalFunctionTable.find(symb_id);
+      it != externalFunctionTable.end())
+    return it->second.firstDerivSymbID;
   else
     throw UnknownExternalFunctionSymbolIDException(symb_id);
 }
@@ -98,8 +100,9 @@ ExternalFunctionsTable::getFirstDerivSymbID(int symb_id) const noexcept(false)
 inline int
 ExternalFunctionsTable::getSecondDerivSymbID(int symb_id) const noexcept(false)
 {
-  if (exists(symb_id))
-    return externalFunctionTable.find(symb_id)->second.secondDerivSymbID;
+  if (auto it = externalFunctionTable.find(symb_id);
+      it != externalFunctionTable.end())
+    return it->second.secondDerivSymbID;
   else
     throw UnknownExternalFunctionSymbolIDException(symb_id);
 }
diff --git a/src/ModelTree.cc b/src/ModelTree.cc
index 11ec1a0d..affb101a 100644
--- a/src/ModelTree.cc
+++ b/src/ModelTree.cc
@@ -1188,7 +1188,7 @@ ModelTree::writeJsonModelLocalVariables(ostream &output, bool write_tef_terms, d
         if (exchange(printed_something, true))
           output << ", ";
 
-        expr_t value = local_variables_table.find(id)->second;
+        expr_t value = local_variables_table.at(id);
         if (write_tef_terms)
           {
             vector<string> efout;
@@ -1323,7 +1323,7 @@ ModelTree::writeLatexModelFile(const string &mod_basename, const string &latex_b
   // Write model local variables
   for (int id : local_variables_vector)
     {
-      expr_t value = local_variables_table.find(id)->second;
+      expr_t value = local_variables_table.at(id);
 
       content_output << R"(\begin{dmath*})" << endl
                      << symbol_table.getTeXName(id) << " = ";
diff --git a/src/ModelTree.hh b/src/ModelTree.hh
index 84e2b085..9cea1fbf 100644
--- a/src/ModelTree.hh
+++ b/src/ModelTree.hh
@@ -1587,7 +1587,7 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
             << R"(, "nparamcols": )" << symbol_table.param_nbr()
             << R"(, "entries": [)";
   for (bool printed_something {false};
-       const auto &[vidx, d] : params_derivatives.find({ 0, 1 })->second)
+       const auto &[vidx, d] : params_derivatives.at({ 0, 1 }))
     {
       if (exchange(printed_something, true))
         rp_output << ", ";
@@ -1618,7 +1618,7 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
             << R"(, "nparamcols": )" << symbol_table.param_nbr()
             << R"(, "entries": [)";
   for (bool printed_something {false};
-       const auto &[vidx, d] : params_derivatives.find({ 1, 1 })->second)
+       const auto &[vidx, d] : params_derivatives.at({ 1, 1 }))
     {
       if (exchange(printed_something, true))
         gp_output << ", ";
@@ -1656,7 +1656,7 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
              << R"(, "nparam2cols": )" << symbol_table.param_nbr()
              << R"(, "entries": [)";
   for (bool printed_something {false};
-       const auto &[vidx, d] : params_derivatives.find({ 0, 2 })->second)
+       const auto &[vidx, d] : params_derivatives.at({ 0, 2 }))
     {
       if (exchange(printed_something, true))
         rpp_output << ", ";
@@ -1690,7 +1690,7 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
              << R"(, "nparam2cols": )" << symbol_table.param_nbr()
              << R"(, "entries": [)";
   for (bool printed_something {false};
-       const auto &[vidx, d] : params_derivatives.find({ 1, 2 })->second)
+       const auto &[vidx, d] : params_derivatives.at({ 1, 2 }))
     {
       if (exchange(printed_something, true))
         gpp_output << ", ";
@@ -1732,7 +1732,7 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
             << R"(, "nparamcols": )" << symbol_table.param_nbr()
             << R"(, "entries": [)";
   for (bool printed_something {false};
-       const auto &[vidx, d] : params_derivatives.find({ 2, 1 })->second)
+       const auto &[vidx, d] : params_derivatives.at({ 2, 1 }))
     {
       if (exchange(printed_something, true))
         hp_output << ", ";
@@ -1779,7 +1779,7 @@ ModelTree::writeJsonParamsDerivativesHelper(bool writeDetails) const
                  << R"(, "nparamcols": )" << symbol_table.param_nbr()
                  << R"(, "entries": [)";
       for (bool printed_something {false};
-           const auto &[vidx, d] : params_derivatives.find({ 3, 1 })->second)
+           const auto &[vidx, d] : params_derivatives.at({ 3, 1 }))
         {
           if (exchange(printed_something, true))
             g3p_output << ", ";
diff --git a/src/StaticModel.cc b/src/StaticModel.cc
index f3648d53..ea1fe969 100644
--- a/src/StaticModel.cc
+++ b/src/StaticModel.cc
@@ -53,7 +53,7 @@ StaticModel::StaticModel(const DynamicModel &m) :
 {
   // Convert model local variables (need to be done first)
   for (int it : m.local_variables_vector)
-    AddLocalVariable(it, m.local_variables_table.find(it)->second->toStatic(*this));
+    AddLocalVariable(it, m.local_variables_table.at(it)->toStatic(*this));
 
   // Convert equations
   int static_only_index = 0;
diff --git a/src/StaticModel.hh b/src/StaticModel.hh
index 7659456d..3435c8e7 100644
--- a/src/StaticModel.hh
+++ b/src/StaticModel.hh
@@ -284,13 +284,13 @@ StaticModel::writeParamsDerivativesFile(const string &basename) const
                        << symbol_table.param_nbr() << ");" << endl
                        << gp_output.str()
                        << "if nargout >= 3" << endl
-                       << "rpp = zeros(" << params_derivatives.find({ 0, 2 })->second.size() << ",4);" << endl
+                       << "rpp = zeros(" << params_derivatives.at({ 0, 2 }).size() << ",4);" << endl
                        << rpp_output.str()
-                       << "gpp = zeros(" << params_derivatives.find({ 1, 2 })->second.size() << ",5);" << endl
+                       << "gpp = zeros(" << params_derivatives.at({ 1, 2 }).size() << ",5);" << endl
                        << gpp_output.str()
                        << "end" << endl
                        << "if nargout >= 5" << endl
-                       << "hp = zeros(" << params_derivatives.find({ 2, 1 })->second.size() << ",5);" << endl
+                       << "hp = zeros(" << params_derivatives.at({ 2, 1 }).size() << ",5);" << endl
                        << hp_output.str()
                        << "end" << endl
                        << "end" << endl;
@@ -316,15 +316,15 @@ StaticModel::writeParamsDerivativesFile(const string &basename) const
 		     << "@inbounds begin" << endl
                      << gp_output.str()
 		     << "end" << endl
-                     << "rpp = zeros(" << params_derivatives.find({ 0, 2 })->second.size() << ",4);" << endl
+                     << "rpp = zeros(" << params_derivatives.at({ 0, 2 }).size() << ",4);" << endl
 		     << "@inbounds begin" << endl
                      << rpp_output.str()
 		     << "end" << endl
-                     << "gpp = zeros(" << params_derivatives.find({ 1, 2 })->second.size() << ",5);" << endl
+                     << "gpp = zeros(" << params_derivatives.at({ 1, 2 }).size() << ",5);" << endl
 		     << "@inbounds begin" << endl
                      << gpp_output.str()
 		     << "end" << endl
-                     << "hp = zeros(" << params_derivatives.find({ 2, 1 })->second.size() << ",5);" << endl
+                     << "hp = zeros(" << params_derivatives.at({ 2, 1 }).size() << ",5);" << endl
 		     << "@inbounds begin" << endl
                      << hp_output.str()
 		     << "end" << endl
diff --git a/src/SubModel.cc b/src/SubModel.cc
index 17d4d6b1..adc91816 100644
--- a/src/SubModel.cc
+++ b/src/SubModel.cc
@@ -130,7 +130,7 @@ const vector<string> &
 TrendComponentModelTable::getEqTags(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return eqtags.find(name_arg)->second;
+  return eqtags.at(name_arg);
 }
 
 void
@@ -148,28 +148,28 @@ const vector<int> &
 TrendComponentModelTable::getNonTargetLhs(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return nontarget_lhs.find(name_arg)->second;
+  return nontarget_lhs.at(name_arg);
 }
 
 const vector<int> &
 TrendComponentModelTable::getTargetLhs(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return target_lhs.find(name_arg)->second;
+  return target_lhs.at(name_arg);
 }
 
 const vector<int> &
 TrendComponentModelTable::getLhs(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return lhs.find(name_arg)->second;
+  return lhs.at(name_arg);
 }
 
 const vector<expr_t> &
 TrendComponentModelTable::getLhsExprT(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return lhs_expr_t.find(name_arg)->second;
+  return lhs_expr_t.at(name_arg);
 }
 
 const map<string, vector<string>> &
@@ -194,7 +194,7 @@ const vector<int> &
 TrendComponentModelTable::getTargetEqNums(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return target_eqnums.find(name_arg)->second;
+  return target_eqnums.at(name_arg);
 }
 
 const map<string, vector<int>> &
@@ -207,21 +207,21 @@ const vector<int> &
 TrendComponentModelTable::getNonTargetEqNums(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return nontarget_eqnums.find(name_arg)->second;
+  return nontarget_eqnums.at(name_arg);
 }
 
 const vector<int> &
 TrendComponentModelTable::getEqNums(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return eqnums.find(name_arg)->second;
+  return eqnums.at(name_arg);
 }
 
 const vector<int> &
 TrendComponentModelTable::getMaxLags(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return max_lags.find(name_arg)->second;
+  return max_lags.at(name_arg);
 }
 
 int
@@ -237,7 +237,7 @@ const vector<bool> &
 TrendComponentModelTable::getDiff(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return diff.find(name_arg)->second;
+  return diff.at(name_arg);
 }
 
 void
@@ -575,7 +575,7 @@ const vector<string> &
 VarModelTable::getEqTags(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return eqtags.find(name_arg)->second;
+  return eqtags.at(name_arg);
 }
 
 void
@@ -643,14 +643,14 @@ const vector<bool> &
 VarModelTable::getDiff(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return diff.find(name_arg)->second;
+  return diff.at(name_arg);
 }
 
 const vector<int> &
 VarModelTable::getEqNums(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return eqnums.find(name_arg)->second;
+  return eqnums.at(name_arg);
 }
 
 void
@@ -693,7 +693,7 @@ const vector<int> &
 VarModelTable::getMaxLags(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return max_lags.find(name_arg)->second;
+  return max_lags.at(name_arg);
 }
 
 int
@@ -709,28 +709,28 @@ const vector<int> &
 VarModelTable::getLhs(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return lhs.find(name_arg)->second;
+  return lhs.at(name_arg);
 }
 
 const vector<int> &
 VarModelTable::getLhsOrigIds(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return lhs_orig_symb_ids.find(name_arg)->second;
+  return lhs_orig_symb_ids.at(name_arg);
 }
 
 const vector<set<pair<int, int>>> &
 VarModelTable::getRhs(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return rhs.find(name_arg)->second;
+  return rhs.at(name_arg);
 }
 
 const vector<expr_t> &
 VarModelTable::getLhsExprT(const string &name_arg) const
 {
   checkModelName(name_arg);
-  return lhs_expr_t.find(name_arg)->second;
+  return lhs_expr_t.at(name_arg);
 }
 
 
diff --git a/src/macro/Environment.cc b/src/macro/Environment.cc
index 7ceb7537..a9b56658 100644
--- a/src/macro/Environment.cc
+++ b/src/macro/Environment.cc
@@ -123,7 +123,7 @@ Environment::print(ostream &output, const vector<string> &vars, const optional<i
   else
     for (const auto &it : vars)
       if (isFunctionDefined(it))
-        printFunction(output, functions.find(it)->second, line, save);
+        printFunction(output, functions.at(it), line, save);
 
   if (parent)
     parent->print(output, vars, line, save);
-- 
GitLab