diff --git a/src/fix_ave_time.cpp b/src/fix_ave_time.cpp index 7efb8cc8a6..3ac8e68cad 100644 --- a/src/fix_ave_time.cpp +++ b/src/fix_ave_time.cpp @@ -79,7 +79,7 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : int expand = 0; char **earg; - int *amap; + int *amap = nullptr; nvalues = utils::expand_args(FLERR,nvalues,&arg[6],mode,earg,lmp,&amap); key2col.clear(); @@ -101,7 +101,8 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR, amap[i]+6,"Invalid fix ave/time argument: {}", arg[i]); val.argindex = argi.get_index1(); - val.iarg = amap[i] + 6; + if (expand) val.iarg = amap[i] + 6; + else val.iarg = i + 6; val.varlen = 0; val.offcol = 0; val.id = argi.get_name(); @@ -278,6 +279,7 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) : if (expand) { for (int i = 0; i < nvalues; i++) delete[] earg[i]; memory->sfree(earg); + memory->sfree(amap); } // allocate memory for averaging diff --git a/src/utils.cpp b/src/utils.cpp index 0007b11e9c..52d7e5113a 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -860,10 +860,12 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod return narg; } - // determine argument offset + // determine argument offset, if possible int ioffset = 0; - for (int i = 0; i < lmp->input->narg; ++i) - if (lmp->input->arg[i] == arg[0]) ioffset = i; + if (lmp->input->arg) { + for (int i = 0; i < lmp->input->narg; ++i) + if (lmp->input->arg[i] == arg[0]) ioffset = i; + } // maxarg should always end up equal to newarg, so caller can free earg @@ -1052,7 +1054,6 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod if (expandflag) { // expand wild card string to nlo/nhi numbers - utils::bounds(file, line, wc, 1, nmax, nlo, nhi, lmp->error, iarg + ioffset); if (newarg + nhi - nlo + 1 > maxarg) { @@ -1086,7 +1087,11 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod } } - if (argmap && *argmap) *argmap = amap; + if (argmap) + *argmap = amap; + else + lmp->memory->sfree(amap); + // fprintf(stderr, "NEWARG %d\n",newarg); for (int i = 0; i < newarg; i++) printf(" arg %d: %s %d\n",i,earg[i], amap ? amap[i] : -1); return newarg; } diff --git a/unittest/cplusplus/test_advanced_utils.cpp b/unittest/cplusplus/test_advanced_utils.cpp index 1da9500b35..468f353080 100644 --- a/unittest/cplusplus/test_advanced_utils.cpp +++ b/unittest/cplusplus/test_advanced_utils.cpp @@ -151,6 +151,10 @@ TEST_F(Advanced_utils, expand_args) args[7] = utils::strdup("c_gofr[*2][2]"); args[8] = utils::strdup("c_gofr[*][*]"); + // disable use of input->command and input->arg which point to the last run command right now + lmp->input->command = nullptr; + lmp->input->arg = nullptr; + auto narg = utils::expand_args(FLERR, oarg, args, 0, earg, lmp); EXPECT_EQ(narg, 16); EXPECT_STREQ(earg[0], "v_step");