Hi, On 2023-08-23 at 16:15:56 +0300, Ilpo Järvinen wrote: >Benchmark argument is handled by custom argument parsing code which is >more complicated than it needs to be. > >Process benchmark argument within the normal getopt() handling and drop >entirely unnecessary ben_ind and has_ben variables. If -b is not given, >setup the default benchmark command right after the switch statement >and make -b to goto over it while it terminates the getopt() loop. > >Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx> >Reviewed-by: Reinette Chatre <reinette.chatre@xxxxxxxxx> >--- > .../testing/selftests/resctrl/resctrl_tests.c | 71 ++++++++++--------- > 1 file changed, 36 insertions(+), 35 deletions(-) > >diff --git a/tools/testing/selftests/resctrl/resctrl_tests.c b/tools/testing/selftests/resctrl/resctrl_tests.c >index 94516d1f4307..ae9001ef7b0a 100644 >--- a/tools/testing/selftests/resctrl/resctrl_tests.c >+++ b/tools/testing/selftests/resctrl/resctrl_tests.c >@@ -169,28 +169,35 @@ static void run_cat_test(int cpu_no, int no_of_bits) > > int main(int argc, char **argv) > { >- bool has_ben = false, mbm_test = true, mba_test = true, cmt_test = true; >- int c, cpu_no = 1, argc_new = argc, i, no_of_bits = 0; >+ bool mbm_test = true, mba_test = true, cmt_test = true; >+ int c, cpu_no = 1, i, no_of_bits = 0; > const char *benchmark_cmd[BENCHMARK_ARGS]; >- int ben_ind, tests = 0; > char *span_str = NULL; > bool cat_test = true; > char *skip_reason; >+ int tests = 0; > int ret; > >- for (i = 0; i < argc; i++) { >- if (strcmp(argv[i], "-b") == 0) { >- ben_ind = i + 1; >- argc_new = ben_ind - 1; >- has_ben = true; >- break; >- } >- } >- >- while ((c = getopt(argc_new, argv, "ht:b:n:p:")) != -1) { >+ while ((c = getopt(argc, argv, "ht:b:n:p:")) != -1) { > char *token; > > switch (c) { >+ case 'b': >+ /* >+ * First move optind back to the (first) optarg and >+ * then build the benchmark command using the >+ * remaining arguments. >+ */ >+ optind--; >+ if (argc - optind >= BENCHMARK_ARGS - 1) >+ ksft_exit_fail_msg("Too long benchmark command"); Isn't this condition off by two? I did some testing and the maximum amount of benchmark arguments is 62 while the array of const char* has 64 spaces. Is it supposed to have less than the maximum capacity? Wouldn't something like this be more valid with BENCHMARK_ARGS equal to 64? : if (argc - optind > BENCHMARK_ARGS) -- Kind regards Maciej Wieczór-Retman