On 2023-08-29 at 16:04:29 +0300, Ilpo Järvinen wrote: >On Tue, 29 Aug 2023, Maciej Wieczór-Retman wrote: >> 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) > >Certainly not off by two as the array must be NULL terminated but it seems >to be off-by-one (to the safe direction), yes. Sorry, yes, off by one, now I can see the NULL just after the loop. -- Kind regards Maciej Wieczór-Retman