Re: top: remove redundant NULL check

2020-06-23 Thread Todd C . Miller
On Tue, 23 Jun 2020 18:31:03 +0200, Klemens Nanni wrote:

> I'd like to remove a NULL check in get_process_info() for the sake of
> simplicity and to reflect that the process list is *always* sorted
> (default is "cpu"), even if not explicitly requested;  this makes it
> easier to argue about the code, imho.

Makes sense.  OK millert@

 - todd



top: remove redundant NULL check

2020-06-23 Thread Klemens Nanni
I'd like to remove a NULL check in get_process_info() for the sake of
simplicity and to reflect that the process list is *always* sorted
(default is "cpu"), even if not explicitly requested;  this makes it
easier to argue about the code, imho.

Details on why this check is never true:

get_process_info() is the function that obtains the process list and
sorts it using the compare function passed to get_process_info().

The function pointer is always picked from the array ordernames[] using
the getorder() helper:

335 int
336 main(int argc, char *argv[])
337 {
...
400 /* determine sorting order index, if necessary */
401 if (order_name != NULL) {
402 if ((order_index = getorder(order_name)) == -1) {
403 new_message(MT_delayed,
404 " %s: unrecognized sorting order", order_name);
405 order_index = 0;
406 }
407 }
...
472 /*
473  *  main loop -- repeat while display count is positive or while it
474  *  indicates infinity (by being -1)
475  */
476 while ((displays == -1) || (displays-- > 0)) {
477 if (winchflag) {
...
513 /* get the current set of processes */
514 processes = get_process_info(&system_info, &ps,
515 proc_compares[order_index]);

This is the only call path to get_process_info() and thus qsort().

order_name is NULL initialized and only set during getopt() parsing iff
-o is used.

order_index is zero initialized and only updated through CMD_order,
the interactive `o' prompt, which uses getorder() to only update it iff
the given order is valid.

getorder() never yields an invalid index for order_names[], hence
proc_compares[order_index] is never NULL and order_index is never out of
bound.


Feedback? OK?

Index: machine.c
===
RCS file: /cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.102
diff -u -p -r1.102 machine.c
--- machine.c   6 Jan 2020 20:05:10 -   1.102
+++ machine.c   23 Jun 2020 15:27:48 -
@@ -491,10 +491,7 @@ get_process_info(struct system_info *si,
}
}
 
-   /* if requested, sort the "interesting" processes */
-   if (compare != NULL)
-   qsort((char *) pref, active_procs,
-   sizeof(struct kinfo_proc *), compare);
+   qsort((char *)pref, active_procs, sizeof(struct kinfo_proc *), compare);
/* remember active and total counts */
si->p_total = total_procs;
si->p_active = pref_len = active_procs;