more strict checking of valid input in utils::bounds() with new tests

This commit is contained in:
Axel Kohlmeyer 2021-03-14 17:59:00 -04:00
parent 1b409fbae8
commit 5d795130db
No known key found for this signature in database
GPG Key ID: D9B44E93BF0C375A
2 changed files with 45 additions and 54 deletions

View File

@ -394,9 +394,16 @@ template<typename TYPE>
void utils::bounds(const char *file, int line, const std::string &str,
bigint nmin, bigint nmax, TYPE &nlo, TYPE &nhi, Error *error)
{
size_t found = str.find_first_of("*");
nlo = nhi = -1;
// check for illegal charcters
size_t found = str.find_first_not_of("*-0123456789");
if (found != std::string::npos) {
if (error) error->all(file,line,fmt::format("Invalid range string: {}",str));
return;
}
found = str.find_first_of("*");
if (found == std::string::npos) { // contains no '*'
nlo = nhi = strtol(str.c_str(),nullptr,10);
} else if (str.size() == 1) { // is only '*'

View File

@ -550,6 +550,18 @@ TEST(Utils, bounds_case1)
utils::bounds(FLERR, "1", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 1);
ASSERT_EQ(nhi, 1);
utils::bounds(FLERR, "1x", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
utils::bounds(FLERR, "-1", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
utils::bounds(FLERR, "+1", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
utils::bounds(FLERR, "1:3", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
}
TEST(Utils, bounds_case2)
@ -563,6 +575,9 @@ TEST(Utils, bounds_case2)
utils::bounds(FLERR, "*", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -10);
ASSERT_EQ(nhi, 5);
utils::bounds(FLERR, "?", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
}
TEST(Utils, bounds_case3)
@ -576,32 +591,9 @@ TEST(Utils, bounds_case3)
utils::bounds(FLERR, "3*", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 3);
ASSERT_EQ(nhi, 5);
}
TEST(Utils, bounds_case4)
{
int nlo, nhi;
nlo = nhi = -1;
utils::bounds(FLERR, "*2", 0, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 0);
ASSERT_EQ(nhi, 2);
utils::bounds(FLERR, "*3", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -10);
ASSERT_EQ(nhi, 3);
}
TEST(Utils, bounds_case5)
{
int nlo, nhi;
nlo = nhi = -1;
utils::bounds(FLERR, "2*5", 0, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 2);
ASSERT_EQ(nhi, 5);
utils::bounds(FLERR, "-2*3", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -2);
ASSERT_EQ(nhi, 3);
utils::bounds(FLERR, "3*:2", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
}
TEST(Utils, boundsbig_case1)
@ -615,6 +607,18 @@ TEST(Utils, boundsbig_case1)
utils::bounds(FLERR, "1", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 1);
ASSERT_EQ(nhi, 1);
utils::bounds(FLERR, "1x", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
utils::bounds(FLERR, "-1", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
utils::bounds(FLERR, "+1", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
utils::bounds(FLERR, "1:3", 1, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
}
TEST(Utils, boundsbig_case2)
@ -628,6 +632,9 @@ TEST(Utils, boundsbig_case2)
utils::bounds(FLERR, "*", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -10);
ASSERT_EQ(nhi, 5);
utils::bounds(FLERR, "?", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
}
TEST(Utils, boundsbig_case3)
@ -641,32 +648,9 @@ TEST(Utils, boundsbig_case3)
utils::bounds(FLERR, "3*", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 3);
ASSERT_EQ(nhi, 5);
}
TEST(Utils, boundsbig_case4)
{
bigint nlo, nhi;
nlo = nhi = -1;
utils::bounds(FLERR, "*2", 0, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 0);
ASSERT_EQ(nhi, 2);
utils::bounds(FLERR, "*3", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -10);
ASSERT_EQ(nhi, 3);
}
TEST(Utils, boundsbig_case5)
{
bigint nlo, nhi;
nlo = nhi = -1;
utils::bounds(FLERR, "2*5", 0, 10, nlo, nhi, nullptr);
ASSERT_EQ(nlo, 2);
ASSERT_EQ(nhi, 5);
utils::bounds(FLERR, "-2*3", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -2);
ASSERT_EQ(nhi, 3);
utils::bounds(FLERR, "3*:2", -10, 5, nlo, nhi, nullptr);
ASSERT_EQ(nlo, -1);
ASSERT_EQ(nhi, -1);
}
TEST(Utils, guesspath)