avoid crash when functions expecting an argument are used without

This commit is contained in:
Axel Kohlmeyer
2021-03-23 18:13:01 -04:00
parent 346c36e227
commit 4f46ee30a2
3 changed files with 19 additions and 11 deletions

View File

@ -1234,6 +1234,9 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
int i = 0; int i = 0;
int expect = ARG; int expect = ARG;
if (str == nullptr)
print_var_error(FLERR,"Invalid syntax in variable formula",ivar);
while (1) { while (1) {
onechar = str[i]; onechar = str[i];
@ -4688,9 +4691,11 @@ void Variable::atom_vector(char *word, Tree **tree,
max allowed # of args = MAXFUNCARG 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; int narg = 0;
args[0] = nullptr;
Tokenizer values(str,","); Tokenizer values(str,",");
while (values.has_next() && narg < MAXFUNCARG) { while (values.has_next() && narg < MAXFUNCARG) {

View File

@ -122,7 +122,7 @@ class Variable : protected Pointers {
Tree **, Tree **, int &, double *, int &); Tree **, Tree **, int &, double *, int &);
int is_atom_vector(char *); int is_atom_vector(char *);
void atom_vector(char *, Tree **, Tree **, int &); 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 &, void print_var_error(const std::string &, int, const std::string &,
int, int global=1); int, int global=1);
void print_tree(Tree *, int); void print_tree(Tree *, int);

View File

@ -37,8 +37,8 @@ const bool have_openmpi = true;
const bool have_openmpi = false; const bool have_openmpi = false;
#endif #endif
using LAMMPS_NS::utils::split_words;
using LAMMPS_NS::MathConst::MY_PI; using LAMMPS_NS::MathConst::MY_PI;
using LAMMPS_NS::utils::split_words;
namespace LAMMPS_NS { namespace LAMMPS_NS {
using ::testing::ExitedWithCode; using ::testing::ExitedWithCode;
@ -227,13 +227,13 @@ TEST_F(VariableTest, Expressions)
ASSERT_FALSE(variable->equalstyle(ivar)); ASSERT_FALSE(variable->equalstyle(ivar));
ivar = variable->find("two"); ivar = variable->find("two");
ASSERT_TRUE(variable->equalstyle(ivar)); 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"); 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"); 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"); 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.*", TEST_FAILURE(".*ERROR: Variable six: Invalid thermo keyword 'XXX' in variable formula.*",
command("print \"${six}\"");); command("print \"${six}\""););
@ -249,14 +249,17 @@ TEST_F(VariableTest, Functions)
command("variable one index 1"); command("variable one index 1");
command("variable two equal random(1,2,643532)"); command("variable two equal random(1,2,643532)");
command("variable three equal atan2(v_one,1)"); command("variable three equal atan2(v_one,1)");
command("variable four equal atan2()");
if (!verbose) ::testing::internal::GetCapturedStdout(); if (!verbose) ::testing::internal::GetCapturedStdout();
ASSERT_EQ(variable->nvar, 3); ASSERT_EQ(variable->nvar, 4);
int ivar = variable->find("two"); int ivar = variable->find("two");
ASSERT_GT(variable->compute_equal(ivar),0.99); ASSERT_GT(variable->compute_equal(ivar), 0.99);
ASSERT_LT(variable->compute_equal(ivar),2.01); ASSERT_LT(variable->compute_equal(ivar), 2.01);
ivar = variable->find("three"); 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 } // namespace LAMMPS_NS