Replace asserts with displaying error messages and/or terminating program in a
controlled manner. Also refine some error handling paths.

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);
-
        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;
        }
        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);
 
        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"
+                                       "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"
+                                       "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);
                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"
+                                       "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"
+                                       "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;
+       }
 
        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;
+                               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


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

Reply via email to