aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/core/lib/strings/numbers.cc
diff options
context:
space:
mode:
authorGravatar A. Unique TensorFlower <gardener@tensorflow.org>2018-04-18 13:13:02 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2018-04-18 13:18:22 -0700
commitf28342c2caab42987e6761abeca84ba3147cddba (patch)
tree94a02cd32b804b16b7aa04544cde1652b0c7f58b /tensorflow/core/lib/strings/numbers.cc
parentf4c6a318eb9eb01440c313a4fc423ac267fdb74e (diff)
Prevent access to deallocated hash map upon exit().
PiperOrigin-RevId: 193404950
Diffstat (limited to 'tensorflow/core/lib/strings/numbers.cc')
-rw-r--r--tensorflow/core/lib/strings/numbers.cc33
1 files changed, 20 insertions, 13 deletions
diff --git a/tensorflow/core/lib/strings/numbers.cc b/tensorflow/core/lib/strings/numbers.cc
index 8f34baa7de..c296daa95d 100644
--- a/tensorflow/core/lib/strings/numbers.cc
+++ b/tensorflow/core/lib/strings/numbers.cc
@@ -34,18 +34,25 @@ namespace tensorflow {
namespace {
template <typename T>
+const std::unordered_map<string, T>* GetSpecialNumsSingleton() {
+ static const std::unordered_map<string, T>* special_nums =
+ CHECK_NOTNULL((new const std::unordered_map<string, T>{
+ {"inf", std::numeric_limits<T>::infinity()},
+ {"+inf", std::numeric_limits<T>::infinity()},
+ {"-inf", -std::numeric_limits<T>::infinity()},
+ {"infinity", std::numeric_limits<T>::infinity()},
+ {"+infinity", std::numeric_limits<T>::infinity()},
+ {"-infinity", -std::numeric_limits<T>::infinity()},
+ {"nan", std::numeric_limits<T>::quiet_NaN()},
+ {"+nan", std::numeric_limits<T>::quiet_NaN()},
+ {"-nan", -std::numeric_limits<T>::quiet_NaN()},
+ }));
+ return special_nums;
+}
+
+template <typename T>
T locale_independent_strtonum(const char* str, const char** endptr) {
- static const std::unordered_map<string, T> special_nums = {
- {"inf", std::numeric_limits<T>::infinity()},
- {"+inf", std::numeric_limits<T>::infinity()},
- {"-inf", -std::numeric_limits<T>::infinity()},
- {"infinity", std::numeric_limits<T>::infinity()},
- {"+infinity", std::numeric_limits<T>::infinity()},
- {"-infinity", -std::numeric_limits<T>::infinity()},
- {"nan", std::numeric_limits<T>::quiet_NaN()},
- {"+nan", std::numeric_limits<T>::quiet_NaN()},
- {"-nan", -std::numeric_limits<T>::quiet_NaN()},
- };
+ auto special_nums = GetSpecialNumsSingleton<T>();
std::stringstream s(str);
// Check if str is one of the special numbers.
@@ -57,8 +64,8 @@ T locale_independent_strtonum(const char* str, const char** endptr) {
std::tolower(special_num_str[i], std::locale::classic());
}
- auto entry = special_nums.find(special_num_str);
- if (entry != special_nums.end()) {
+ auto entry = special_nums->find(special_num_str);
+ if (entry != special_nums->end()) {
*endptr = str + (s.eof() ? static_cast<std::iostream::pos_type>(strlen(str))
: s.tellg());
return entry->second;