Hi,

committing amended (see below).

On Wed, Nov 26, 2014 at 10:15 AM, pi-cheng.chen
<pi-cheng.c...@linaro.org> wrote:
> Replace asserts with displaying error messages and/or terminating program in a
> controlled manner. Also refine some error handling paths.

This description doesn't really tell what is wrong in the original
code. Replaced the commit message with the card description:

"Some parts of the code use asserts as a way to terminate execution in
case input data processing fails. This leaves the user in the black
regarding the reason why the tool terminated (and possibly dumped a
core file).
Replace the abnormal termination with displaying error message and
terminating the application in a controlled fashion."

>
> Signed-off-by: Pi-Cheng Chen <pi-cheng.c...@linaro.org>
> ---
>  energy_model.c |  3 ---
>  idlestat.c     | 62 
> +++++++++++++++++++++++++++++++++++++++++++---------------
>  topology.c     | 12 ++++++------
>  3 files changed, 52 insertions(+), 25 deletions(-)
>
> diff --git a/energy_model.c b/energy_model.c
> index 87ea3a8..b564ec6 100644
> --- a/energy_model.c
> +++ b/energy_model.c
> @@ -3,7 +3,6 @@
>  #include <string.h>
>  #include <stdbool.h>
>  #include <errno.h>
> -#include <assert.h>
>
>  #include "energy_model.h"
>  #include "idlestat.h"
> @@ -92,8 +91,6 @@ int parse_energy_model(struct program_options *options)
>         char *path = options->energy_model_filename;
>         int ret;
>
> -       assert(path != NULL);
> -

This is a valid assertation (the function should never be called with
a NULL energy model filename and the caller should enforce it and this
condition does not depend directly on user input). Removed removing
it.

>         f = fopen(path, "r");
>         if (!f) {
>                 if (errno == ENOENT) {
> diff --git a/idlestat.c b/idlestat.c
> index eff04e5..5bd2a14 100644
> --- a/idlestat.c
> +++ b/idlestat.c
> @@ -40,7 +40,6 @@
>  #include <sys/types.h>
>  #include <sys/resource.h>
>  #include <sys/wait.h>
> -#include <assert.h>
>
>  #include "idlestat.h"
>  #include "utils.h"
> @@ -647,7 +646,8 @@ static int alloc_pstate(struct cpufreq_pstates *pstates, 
> unsigned int freq)
>
>         tmp = realloc(pstate, sizeof(*pstate) * (nrfreq + 1));
>         if (!tmp) {
> -               perror("realloc pstate");
> +               fprintf(stderr, "%s: Failed ot realloc memory for pstate. "
> +                               "Exiting.\n", __func__);
>                 return -1;

Massaged the message and replaced return with exit(1), as we don't
gain anything by propagating this error.

>         }
>         pstate = tmp;
> @@ -864,7 +864,8 @@ static void cpu_change_pstate(struct cpuidle_datas 
> *datas, int cpu,
>         next = freq_to_pstate_index(ps, freq);
>         if (next < 0)
>                 next = alloc_pstate(ps, freq);
> -       assert(next >= 0);
> +       if (next < 0)
> +               exit(1);

Especially given the above change, this assert is valid and should not
be removed.

>
>         switch (cur) {
>         case 1:
> @@ -1090,15 +1091,24 @@ static int get_wakeup_irq(struct cpuidle_datas 
> *datas, char *buffer, int count)
>         char irqname[NAMELEN+1];
>
>         if (strstr(buffer, "irq_handler_entry")) {
> -               assert(sscanf(buffer, TRACE_IRQ_FORMAT, &cpu, &irqid,
> -                             irqname) == 3);
> +               if (sscanf(buffer, TRACE_IRQ_FORMAT, &cpu, &irqid,
> +                             irqname) != 3) {
> +                       fprintf(stderr, "warning: Unrecognized"

Added missing space.

> +                                       "irq_handler_entry record. Skip 
> it.\n");
> +                       return -1;
> +               }
>
>                 store_irq(cpu, irqid, irqname, datas);
>                 return 0;
>         }
>
>         if (strstr(buffer, "ipi_entry")) {
> -               assert(sscanf(buffer, TRACE_IPIIRQ_FORMAT, &cpu, irqname) == 
> 2);
> +               if (sscanf(buffer, TRACE_IPIIRQ_FORMAT, &cpu, irqname) != 2) {
> +                       fprintf(stderr, "warning: Unrecognized ipi_entry"

Added missing space.

> +                                       "record. Skip it.\n");
> +                       return -1;
> +               }
> +
>                 irqname[strlen(irqname) - 1] = '\0';
>                 store_irq(cpu, -1, irqname, datas);
>                 return 0;
> @@ -1128,20 +1138,23 @@ struct cpuidle_datas *idlestat_load(struct 
> program_options *options)
>         if (strstr(buffer, "idlestat")) {
>                 options->format = IDLESTAT_HEADER;
>                 fgets(buffer, BUFSIZE, f);
> -               assert(sscanf(buffer, "cpus=%u", &nrcpus) == 1);
> +               if (sscanf(buffer, "cpus=%u", &nrcpus) != 1)
> +                       nrcpus = 0;
>                 fgets(buffer, BUFSIZE, f);
>         } else if (strstr(buffer, "# tracer")) {
>                 options->format = TRACE_CMD_HEADER;
>                 while(!feof(f)) {
>                         if (buffer[0] != '#')
>                                 break;
> -                       if (strstr(buffer, "#P:"))
> -                               assert(sscanf(buffer, "#%*[^#]#P:%u", 
> &nrcpus) == 1);
> +                       if (strstr(buffer, "#P:") &&
> +                           sscanf(buffer, "#%*[^#]#P:%u", &nrcpus) != 1)
> +                               nrcpus = 0;
>                         fgets(buffer, BUFSIZE, f);
>                 }
>         } else {
>                 fprintf(stderr, "%s: unrecognized import format in '%s'\n",
>                                 __func__, options->filename);
> +               fclose(f);

Good catch.

>                 return NULL;
>         }
>
> @@ -1185,8 +1198,13 @@ struct cpuidle_datas *idlestat_load(struct 
> program_options *options)
>
>         do {
>                 if (strstr(buffer, "cpu_idle")) {
> -                       assert(sscanf(buffer, TRACE_FORMAT, &time, &state,
> -                                     &cpu) == 3);
> +                       if (sscanf(buffer, TRACE_FORMAT, &time, &state, &cpu)
> +                           != 3) {
> +                               fprintf(stderr, "warning: Unrecognized 
> cpuidle"

Added missing space.

> +                                       "record. The result of analysis might 
> "
> +                                       "be wrong.\n");
> +                               continue;
> +                       }
>
>                         if (start) {
>                                 begin = time;
> @@ -1198,8 +1216,13 @@ struct cpuidle_datas *idlestat_load(struct 
> program_options *options)
>                         count++;
>                         continue;
>                 } else if (strstr(buffer, "cpu_frequency")) {
> -                       assert(sscanf(buffer, TRACE_FORMAT, &time, &freq,
> -                                     &cpu) == 3);
> +                       if (sscanf(buffer, TRACE_FORMAT, &time, &freq, &cpu)
> +                           != 3) {
> +                               fprintf(stderr, "warning: Unrecognized 
> cpufreq"

Added missing space.

> +                                       "record. The result of analysis might 
> "
> +                                       "be wrong.\n");
> +                               continue;
> +                       }
>                         cpu_change_pstate(datas, cpu, freq, time);
>                         count++;
>                         continue;
> @@ -1524,8 +1547,11 @@ static int idlestat_store(const char *path, double 
> start_ts, double end_ts,
>         if (ret < 0)
>                 return -1;
>
> -       if (initp)
> -               assert(ret == initp->nrcpus);
> +       if (initp && ret != initp->nrcpus) {
> +               fprintf(stderr, "%s: The number of CPUs is inconsistency\n",
> +                       __func__);
> +               return -1;
> +       }

This assertation is valid and should not be removed.

>
>         f = fopen(path, "w+");
>
> @@ -1716,7 +1742,11 @@ int main(int argc, char *argv[], char *const envp[])
>         if ((options.mode == TRACE) || args < argc) {
>
>                 /* Read cpu topology info from sysfs */
> -               read_sysfs_cpu_topo();
> +               if (read_sysfs_cpu_topo()) {
> +                       fprintf(stderr, "Failed to read CPU topology info 
> from"
> +                               " sysfs.\n");
> +                       return 1;
> +               }
>
>                 /* Stop tracing (just in case) */
>                 if (idlestat_trace_enable(false)) {
> diff --git a/topology.c b/topology.c
> index 92521e1..eddd479 100644
> --- a/topology.c
> +++ b/topology.c
> @@ -34,7 +34,6 @@
>  #include <dirent.h>
>  #include <ctype.h>
>  #include <sys/stat.h>
> -#include <assert.h>
>
>  #include "list.h"
>  #include "utils.h"
> @@ -313,8 +312,11 @@ static int topo_folder_scan(char *path, folder_filter_t 
> filter)
>                         closedir(dir_topology);
>
>                         read_topology_cb(newpath, &cpu_info);
> -                       assert(sscanf(direntp->d_name, "cpu%d",
> -                                     &cpu_info.cpu_id) == 1);
> +                       if (sscanf(direntp->d_name, "cpu%d",
> +                                     &cpu_info.cpu_id) != 1) {
> +                               ret = -1;

Added an error message.

> +                               goto out_free_newpath;
> +                       }
>                         add_topo_info(&g_cpu_topo_list, &cpu_info);
>                 }
>
> @@ -341,9 +343,7 @@ int init_cpu_topo_info(void)
>
>  int read_sysfs_cpu_topo(void)
>  {
> -       topo_folder_scan("/sys/devices/system/cpu", cpu_filter_cb);
> -
> -       return 0;
> +       return topo_folder_scan("/sys/devices/system/cpu", cpu_filter_cb);
>  }
>
>  int read_cpu_topo_info(FILE *f, char *buf)
> --
> 1.9.1
>

Tuukka

_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to