[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/4] qom: Clean up fragile use of error_is_set()
From: |
Andreas Färber |
Subject: |
Re: [Qemu-devel] [PATCH 3/4] qom: Clean up fragile use of error_is_set() in set() methods |
Date: |
Sat, 26 Apr 2014 01:02:05 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 |
Am 25.04.2014 12:44, schrieb Markus Armbruster:
> Using error_is_set(ERRP) to find out whether a function failed is
> either wrong, fragile, or unnecessarily opaque. It's wrong when ERRP
> may be null, because errors go undetected when it is. It's fragile
> when proving ERRP non-null involves a non-local argument. Else, it's
> unnecessarily opaque (see commit 84d18f0).
>
> I guess the error_is_set(errp) in the ObjectProperty set() methods are
> merely fragile right now, because I can't find a call chain that
> passes a null errp argument.
>
> Make the code more robust and more obviously correct: receive the
> error in a local variable, then propagate it through the parameter.
>
> Signed-off-by: Markus Armbruster <address@hidden>
Tweaking as follows:
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index 5c08611..2e21eba 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -746,11 +746,11 @@ static void set_prop_arraylen(Object *obj, Visitor
*v, void *opaque,
* array-length field in the device struct, we have to create the
* array itself and dynamically add the corresponding properties.
*/
- Error *local_err = NULL;
DeviceState *dev = DEVICE(obj);
Property *prop = opaque;
uint32_t *alenptr = qdev_get_prop_ptr(dev, prop);
void **arrayptr = (void *)dev + prop->arrayoffset;
+ Error *local_err = NULL;
void *eltptr;
const char *arrayname;
int i;
diff --git a/hw/misc/tmp105.c b/hw/misc/tmp105.c
index e11657d..636ee97 100644
--- a/hw/misc/tmp105.c
+++ b/hw/misc/tmp105.c
@@ -67,8 +67,8 @@ static void tmp105_get_temperature(Object *obj,
Visitor *v, void *opaque,
static void tmp105_set_temperature(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
{
- Error *local_err = NULL;
TMP105State *s = TMP105(obj);
+ Error *local_err = NULL;
int64_t temp;
visit_type_int(v, &temp, name, &local_err);
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
index 51f02eb..971a921 100644
--- a/hw/virtio/virtio-balloon.c
+++ b/hw/virtio/virtio-balloon.c
@@ -141,8 +141,8 @@ static void balloon_stats_set_poll_interval(Object
*obj, struct Visitor *v,
void *opaque, const char *name,
Error **errp)
{
- Error *local_err = NULL;
VirtIOBalloon *s = opaque;
+ Error *local_err = NULL;
int64_t value;
visit_type_int(v, &value, name, &local_err);
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 73954a7..8f193a9 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1296,11 +1296,11 @@ static void x86_cpuid_version_get_family(Object
*obj, Visitor *v, void *opaque,
static void x86_cpuid_version_set_family(Object *obj, Visitor *v, void
*opaque,
const char *name, Error **errp)
{
- Error *local_err = NULL;
X86CPU *cpu = X86_CPU(obj);
CPUX86State *env = &cpu->env;
const int64_t min = 0;
const int64_t max = 0xff + 0xf;
+ Error *local_err = NULL;
int64_t value;
visit_type_int(v, &value, name, &local_err);
@@ -1337,11 +1337,11 @@ static void x86_cpuid_version_get_model(Object
*obj, Visitor *v, void *opaque,
static void x86_cpuid_version_set_model(Object *obj, Visitor *v, void
*opaque,
const char *name, Error **errp)
{
- Error *local_err = NULL;
X86CPU *cpu = X86_CPU(obj);
CPUX86State *env = &cpu->env;
const int64_t min = 0;
const int64_t max = 0xff;
+ Error *local_err = NULL;
int64_t value;
visit_type_int(v, &value, name, &local_err);
@@ -1375,11 +1375,11 @@ static void
x86_cpuid_version_set_stepping(Object *obj, Visitor *v,
void *opaque, const char *name,
Error **errp)
{
- Error *local_err = NULL;
X86CPU *cpu = X86_CPU(obj);
CPUX86State *env = &cpu->env;
const int64_t min = 0;
const int64_t max = 0xf;
+ Error *local_err = NULL;
int64_t value;
visit_type_int(v, &value, name, &local_err);
@@ -1514,10 +1514,10 @@ static void x86_cpuid_get_tsc_freq(Object *obj,
Visitor *v, void *opaque,
static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, void *opaque,
const char *name, Error **errp)
{
- Error *local_err = NULL;
X86CPU *cpu = X86_CPU(obj);
const int64_t min = 0;
const int64_t max = INT64_MAX;
+ Error *local_err = NULL;
int64_t value;
visit_type_int(v, &value, name, &local_err);
Regards,
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
- Re: [Qemu-devel] [PATCH 4/4] arm: Clean up fragile use of error_is_set() in realize() methods, (continued)
Re: [Qemu-devel] [PATCH 4/4] arm: Clean up fragile use of error_is_set() in realize() methods, Peter Maydell, 2014/04/26
[Qemu-devel] [PATCH 1/4] hw: Consistently name Error * objects err, and not errp, Markus Armbruster, 2014/04/25
[Qemu-devel] [PATCH 2/4] hw: Consistently name Error ** objects errp, and not err, Markus Armbruster, 2014/04/25
[Qemu-devel] [PATCH 3/4] qom: Clean up fragile use of error_is_set() in set() methods, Markus Armbruster, 2014/04/25
- Re: [Qemu-devel] [PATCH 3/4] qom: Clean up fragile use of error_is_set() in set() methods,
Andreas Färber <=
Re: [Qemu-devel] [PATCH 0/4] hw: Purge error_is_set(), Andreas Färber, 2014/04/25