]> sigrok.org Git - libsigrok.git/commitdiff
motech-lps-30x: fix several compiler warnings
authorGerhard Sittig <redacted>
Fri, 9 Feb 2018 18:17:13 +0000 (19:17 +0100)
committerUwe Hermann <redacted>
Fri, 9 Feb 2018 20:37:39 +0000 (21:37 +0100)
Check pointers' validity before dereferencing them. Explicitly assign a
default value to variables, before conversion routines conditionally
assign the "real" value (and don't in case of conversion errors). This
avoids processing "garbage" data.

Strictly speaking I cannot see how the conversion routine returns OK and
has _not_ assigned a result. But the explicit assignment won't harm
either, and matches the fallback when the conversion fails (detectibly).
Which means that runtime behaviour won't change.

This was reported by clang's scan-build.

src/hardware/motech-lps-30x/api.c
src/hardware/motech-lps-30x/protocol.c

index 0c5817897499d3de0121d5260ac69e06d6e0cf4f..af3ee4f0aecbe504943b9aafb215c6ddc3395769 100644 (file)
@@ -650,6 +650,8 @@ static int config_list(uint32_t key, GVariant **data,
                case SR_CONF_DEVICE_OPTIONS:
                        return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
                case SR_CONF_CHANNEL_CONFIG:
+                       if (!devc || !devc->model)
+                               return SR_ERR_ARG;
                        if (devc->model->modelid <= LPS_303) {
                                /* The 1-channel models. */
                                *data = g_variant_new_strv(channel_modes, 1);
@@ -675,9 +677,13 @@ static int config_list(uint32_t key, GVariant **data,
                        *data = std_gvar_array_u32(ARRAY_AND_SIZE(devopts_cg_ch3));
                break;
        case SR_CONF_VOLTAGE_TARGET:
+               if (!devc || !devc->model)
+                       return SR_ERR_ARG;
                *data = std_gvar_min_max_step_array(devc->model->channels[ch_idx].voltage);
                break;
        case SR_CONF_CURRENT_LIMIT:
+               if (!devc || !devc->model)
+                       return SR_ERR_ARG;
                *data = std_gvar_min_max_step_array(devc->model->channels[ch_idx].current);
                break;
        default:
index ce097274428fc2f472c015dc6f4bd6c8b00c16bc..b31f2ee1d33ad83bcf48f33e8881a32f55290f4b 100644 (file)
@@ -76,6 +76,8 @@ static void process_line(struct sr_dev_inst *sdi)
        int auxint;
 
        devc = sdi->priv;
+       if (!devc)
+               return;
 
        switch (devc->acq_req_pending) {
        case 0: /* Should not happen... */
@@ -87,6 +89,7 @@ static void process_line(struct sr_dev_inst *sdi)
                case AQ_U2:
                case AQ_I1:
                case AQ_I2:
+                       dbl = 0.0;
                        if (sr_atod_ascii(devc->buf, &dbl) != SR_OK) {
                                sr_err("Failed to convert '%s' to double, errno=%d %s",
                                        devc->buf, errno, g_strerror(errno));
@@ -94,6 +97,7 @@ static void process_line(struct sr_dev_inst *sdi)
                        }
                        break;
                case AQ_STATUS:
+                       auxint = 0;
                        if (sr_atoi(devc->buf, &auxint) != SR_OK) {
                                sr_err("Failed to convert '%s' to int, errno=%d %s",
                                        devc->buf, errno, g_strerror(errno));