diff --git a/src/variable.cpp b/src/variable.cpp index eb1deaae15..9a8236fdb4 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1234,6 +1234,9 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) int i = 0; int expect = ARG; + if (str == nullptr) + print_var_error(FLERR,"Invalid syntax in variable formula",ivar); + while (1) { onechar = str[i]; @@ -4688,9 +4691,11 @@ void Variable::atom_vector(char *word, Tree **tree, max allowed # of args = MAXFUNCARG ------------------------------------------------------------------------- */ -int Variable::parse_args(char *str, char **args) +int Variable::parse_args(const std::string &str, char **args) { int narg = 0; + args[0] = nullptr; + Tokenizer values(str,","); while (values.has_next() && narg < MAXFUNCARG) { diff --git a/src/variable.h b/src/variable.h index 5dc8748936..50d276bb14 100644 --- a/src/variable.h +++ b/src/variable.h @@ -122,7 +122,7 @@ class Variable : protected Pointers { Tree **, Tree **, int &, double *, int &); int is_atom_vector(char *); void atom_vector(char *, Tree **, Tree **, int &); - int parse_args(char *, char **); + int parse_args(const std::string &, char **); void print_var_error(const std::string &, int, const std::string &, int, int global=1); void print_tree(Tree *, int); diff --git a/unittest/commands/test_variables.cpp b/unittest/commands/test_variables.cpp index cc20ea2b96..90a0fe00e7 100644 --- a/unittest/commands/test_variables.cpp +++ b/unittest/commands/test_variables.cpp @@ -37,8 +37,8 @@ const bool have_openmpi = true; const bool have_openmpi = false; #endif -using LAMMPS_NS::utils::split_words; using LAMMPS_NS::MathConst::MY_PI; +using LAMMPS_NS::utils::split_words; namespace LAMMPS_NS { using ::testing::ExitedWithCode; @@ -227,13 +227,13 @@ TEST_F(VariableTest, Expressions) ASSERT_FALSE(variable->equalstyle(ivar)); ivar = variable->find("two"); ASSERT_TRUE(variable->equalstyle(ivar)); - ASSERT_DOUBLE_EQ(variable->compute_equal(ivar),2.0); + ASSERT_DOUBLE_EQ(variable->compute_equal(ivar), 2.0); ivar = variable->find("three"); - ASSERT_DOUBLE_EQ(variable->compute_equal(ivar),3.0); + ASSERT_DOUBLE_EQ(variable->compute_equal(ivar), 3.0); ivar = variable->find("four"); - ASSERT_DOUBLE_EQ(variable->compute_equal(ivar),MY_PI); + ASSERT_DOUBLE_EQ(variable->compute_equal(ivar), MY_PI); ivar = variable->find("five"); - ASSERT_GE(variable->compute_equal(ivar),20210310); + ASSERT_GE(variable->compute_equal(ivar), 20210310); TEST_FAILURE(".*ERROR: Variable six: Invalid thermo keyword 'XXX' in variable formula.*", command("print \"${six}\"");); @@ -249,14 +249,17 @@ TEST_F(VariableTest, Functions) command("variable one index 1"); command("variable two equal random(1,2,643532)"); command("variable three equal atan2(v_one,1)"); + command("variable four equal atan2()"); if (!verbose) ::testing::internal::GetCapturedStdout(); - ASSERT_EQ(variable->nvar, 3); + ASSERT_EQ(variable->nvar, 4); int ivar = variable->find("two"); - ASSERT_GT(variable->compute_equal(ivar),0.99); - ASSERT_LT(variable->compute_equal(ivar),2.01); + ASSERT_GT(variable->compute_equal(ivar), 0.99); + ASSERT_LT(variable->compute_equal(ivar), 2.01); ivar = variable->find("three"); - ASSERT_DOUBLE_EQ(variable->compute_equal(ivar),0.25*MY_PI); + ASSERT_DOUBLE_EQ(variable->compute_equal(ivar), 0.25 * MY_PI); + TEST_FAILURE(".*ERROR: Variable four: Invalid syntax in variable formula.*", + command("print \"${four}\"");); } } // namespace LAMMPS_NS