Skip to content

Commit 2effcb1

Browse files
committed
utils.h: reject preceding 0 in strToInt()
1 parent 2ae43e7 commit 2effcb1

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

lib/utils.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,11 @@ bool strToInt(const std::string& str, T &num, std::string* err = nullptr)
242242
*err = "not an integer";
243243
return false;
244244
}
245+
if (str.size() > 1 && str.front() == '0') {
246+
if (err)
247+
*err = "not an integer";
248+
return false;
249+
}
245250
if (tmp < std::numeric_limits<T>::min() || tmp > std::numeric_limits<T>::max()) {
246251
if (err)
247252
*err = "out of range (limits)";
@@ -282,6 +287,11 @@ bool strToInt(const std::string& str, T &num, std::string* err = nullptr)
282287
*err = "not an integer";
283288
return false;
284289
}
290+
if (str.size() > 1 && str.front() == '0') {
291+
if (err)
292+
*err = "not an integer";
293+
return false;
294+
}
285295
if (tmp > std::numeric_limits<T>::max()) {
286296
if (err)
287297
*err = "out of range (limits)";

test/testutils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ class TestUtils : public TestFixture {
247247
ASSERT_THROW_EQUALS(::strToInt<int>("1U"), std::runtime_error, "converting '1U' to integer failed - not an integer (pos)");
248248
ASSERT_THROW_EQUALS(::strToInt<int>("1L"), std::runtime_error, "converting '1L' to integer failed - not an integer (pos)");
249249
ASSERT_THROW_EQUALS(::strToInt<int>("1Z"), std::runtime_error, "converting '1Z' to integer failed - not an integer (pos)");
250-
// ASSERT_THROW_EQUALS(::strToInt<int>("01"), std::runtime_error, "converting '01' to integer failed - not an integer"); // TODO: should fail
250+
ASSERT_THROW_EQUALS(::strToInt<int>("01"), std::runtime_error, "converting '01' to integer failed - not an integer");
251251
ASSERT_THROW_EQUALS(::strToInt<int>("0x1"), std::runtime_error, "converting '0x1' to integer failed - not an integer (pos)");
252252
ASSERT_THROW_EQUALS(::strToInt<int>("0b1"), std::runtime_error, "converting '0b1' to integer failed - not an integer (pos)");
253253
ASSERT_THROW_EQUALS(::strToInt<int>("one"), std::runtime_error, "converting 'one' to integer failed - not an integer (invalid_argument)");
@@ -264,7 +264,7 @@ class TestUtils : public TestFixture {
264264
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("1U"), std::runtime_error, "converting '1U' to integer failed - not an integer (pos)");
265265
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("1L"), std::runtime_error, "converting '1L' to integer failed - not an integer (pos)");
266266
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("1Z"), std::runtime_error, "converting '1Z' to integer failed - not an integer (pos)");
267-
// ASSERT_THROW_EQUALS(::strToInt<unsigned int>("01"), std::runtime_error, "converting '01' to integer failed - not an integer"); // TODO: should fail
267+
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("01"), std::runtime_error, "converting '01' to integer failed - not an integer");
268268
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("0x1"), std::runtime_error, "converting '0x1' to integer failed - not an integer (pos)");
269269
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("0b1"), std::runtime_error, "converting '0b1' to integer failed - not an integer (pos)");
270270
ASSERT_THROW_EQUALS(::strToInt<unsigned int>("one"), std::runtime_error, "converting 'one' to integer failed - not an integer (invalid_argument)");

0 commit comments

Comments
 (0)