[Pdbg] [PATCH v2 1/7] main: Overhaul target selection
Amitay Isaacs
amitay at ozlabs.org
Mon Jun 4 18:30:32 AEST 2018
On Mon, 2018-06-04 at 14:21 +1000, Alistair Popple wrote:
> Thanks Amitay. A couple more comments below:
>
> > + while ((tok = strtok_r(tmp, ",", &saveptr)) != NULL) {
> > + char *a, *b, *saveptr2 = NULL;
> > + int from, to;
>
> These should be unsigned to avoid somewhat contrived errors like
> this:
>
> ./pdbg -p 2147483649,4294967295 getscom 0xf000f
> Segmentation fault
Tests, tests, we need tests. :-)
>
> > +
> > +
> > + a = strtok_r(tok, "-", &saveptr2);
> > + if (a == NULL) {
> > + return false;
> > + } else {
> > + from = atoi(a);
> > + if (from >= max) {
> > + return false;
> > + }
> > + }
> > +
> > + b = strtok_r(NULL, "-", &saveptr2);
> > + if (b == NULL) {
> > + to = from;
> > + } else {
> > + to = atoi(b);
>
> I think it would be preferable to detect errors here. At the moment
> the following works:
>
> ./pdbg -p 0-0xa ...
>
> but:
>
> ./pdbg -p 1-0xa ...
>
> doesn't. Which is not a problem in that I don't think people will
> want to
> specify things in hex (altough perhaps they do and is there any cost
> to
> supporting it?), but an error would be less confusing than guessing
> the users
> intent.
Will switch to using stroul instead of atoi.
>
> > + if (to >= max) {
> > + return false;
> > + }
> > + }
> > +
> > + if (from > to)
> > + return false;
>
> Should we add an assert(to < max) here? I can see at present that the
> above code
> bails if to/from is >= max but future changes could alter that and
> lead to an
> overflow in the below.
I think we should never assert on user input. Assert is good to catch
programming errors. For invalid user-input, we should print
appropriate error message.
>
> > + for (i=from; i<=to; i++)
>
> Also very minor style nit-pick - most of the exsiting code has
> whitespace
> between operators (ie. for (i = from; i <= to; i++)), so it would be
> good if we
> could maintain that. Thanks!
Sure.
>
> - Alistair
>
> > + list[i] = 1;
> > +
> > + tmp = NULL;
> > + };
> > +
> > + n = 0;
> > + for (i=0; i<max; i++) {
> > + if (list[i] == 1)
> > + n++;
> > + }
> > +
> > + *count = n;
> > + return true;
> > +}
> > +
> > static bool parse_options(int argc, char *argv[])
> > {
> > int c;
> > bool opt_error = true;
> > - static int current_processor = INT_MAX, current_chip =
> > INT_MAX, current_thread = INT_MAX;
> > + int p_list[MAX_PROCESSORS];
> > + int c_list[MAX_CHIPS];
> > + int t_list[MAX_THREADS];
> > + int p_count = 0, c_count = 0, t_count = 0;
> > + int i, j, k;
> > struct option long_opts[] = {
> > {"all", no_argument,
> > NULL, 'a'},
> > {"backend", required_argument,
> > NULL, 'b'},
> > @@ -195,50 +256,45 @@ static bool parse_options(int argc, char
> > *argv[])
> > switch(c) {
> > case 'a':
> > opt_error = false;
> > - for (current_processor = 0;
> > current_processor < MAX_PROCESSORS; current_processor++) {
> > - processorsel[current_processor] =
> > &chipsel[current_processor][0];
> > - for (current_chip = 0;
> > current_chip < MAX_CHIPS; current_chip++) {
> > - chipsel[current_processor]
> > [current_chip] = &threadsel[current_processor][current_chip][0];
> > - for (current_thread = 0;
> > current_thread < MAX_THREADS; current_thread++)
> > - threadsel[current_
> > processor][current_chip][current_thread] = 1;
> > - }
> > +
> > + if (p_count == 0) {
> > + p_count = MAX_PROCESSORS;
> > + for (i=0; i<MAX_PROCESSORS; i++)
> > + p_list[i] = 1;
> > + }
> > +
> > + if (c_count == 0) {
> > + c_count = MAX_CHIPS;
> > + for (i=0; i<MAX_CHIPS; i++)
> > + c_list[i] = 1;
> > + }
> > +
> > + if (t_count == 0) {
> > + t_count = MAX_THREADS;
> > + for (i=0; i<MAX_THREADS; i++)
> > + t_list[i] = 1;
> > }
> > break;
> >
> > case 'p':
> > - errno = 0;
> > - current_processor = strtoul(optarg,
> > &endptr, 0);
> > - opt_error = (errno || *endptr != '\0');
> > - if (!opt_error) {
> > - if (current_processor >=
> > MAX_PROCESSORS)
> > - opt_error = true;
> > - else
> > - processorsel[current_proce
> > ssor] = &chipsel[current_processor][0];
> > - }
> > + if (!parse_list(optarg, MAX_PROCESSORS,
> > p_list, &p_count))
> > + fprintf(stderr, "Failed to parse
> > '-p %s'\n", optarg);
> > + else
> > + opt_error = false;
> > break;
> >
> > case 'c':
> > - errno = 0;
> > - current_chip = strtoul(optarg, &endptr,
> > 0);
> > - opt_error = (errno || *endptr != '\0');
> > - if (!opt_error) {
> > - if (current_chip >= MAX_CHIPS)
> > - opt_error = true;
> > - else
> > - chipsel[current_processor]
> > [current_chip] = &threadsel[current_processor][current_chip][0];
> > - }
> > + if (!parse_list(optarg, MAX_CHIPS, c_list,
> > &c_count))
> > + fprintf(stderr, "Failed to parse
> > '-c %s'\n", optarg);
> > + else
> > + opt_error = false;
> > break;
> >
> > case 't':
> > - errno = 0;
> > - current_thread = strtoul(optarg, &endptr,
> > 0);
> > - opt_error = (errno || *endptr != '\0');
> > - if (!opt_error) {
> > - if (current_thread >= MAX_THREADS)
> > - opt_error = true;
> > - else
> > - threadsel[current_processo
> > r][current_chip][current_thread] = 1;
> > - }
> > + if (!parse_list(optarg, MAX_THREADS,
> > t_list, &t_count))
> > + fprintf(stderr, "Failed to parse
> > '-t %s'\n", optarg);
> > + else
> > + opt_error = false;
> > break;
> >
> > case 'b':
> > @@ -292,10 +348,45 @@ static bool parse_options(int argc, char
> > *argv[])
> > }
> > } while (c != EOF && !opt_error);
> >
> > - if (opt_error)
> > + if (opt_error) {
> > print_usage(basename(argv[0]));
> > + return false;
> > + }
> > +
> > + if ((c_count > 0 || t_count > 0) && p_count == 0) {
> > + fprintf(stderr, "No processor(s) selected\n");
> > + fprintf(stderr, "Use -p or -a to select
> > processor(s)\n");
> > + return false;
> > + }
> > +
> > + if (t_count > 0 && c_count == 0) {
> > + fprintf(stderr, "No chip(s) selected\n");
> > + fprintf(stderr, "Use -c or -a to select
> > chip(s)\n");
> > + return false;
> > + }
> > +
> > + for (i=0; i<MAX_PROCESSORS; i++) {
> > + if (p_list[i] == 0)
> > + continue;
> > +
> > + processorsel[i] = &chipsel[i][0];
> > +
> > + for (j=0; j<MAX_CHIPS; j++) {
> > + if (c_list[j] == 0)
> > + continue;
> > +
> > + chipsel[i][j] = &threadsel[i][j][0];
> > +
> > + for (k=0; k<MAX_THREADS; k++) {
> > + if (t_list[k] == 0)
> > + continue;
> > +
> > + threadsel[i][j][k] = 1;
> > + }
> > + }
> > + }
> >
> > - return !opt_error;
> > + return true;
> > }
> >
> > void target_select(struct pdbg_target *target)
> >
>
>
Amitay.
--
Reality is a nice place to visit, but I sure would not want to live there.
More information about the Pdbg
mailing list