diff options
author | mmh <mmh@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2004-03-08 04:39:50 +0000 |
---|---|---|
committer | mmh <mmh@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2004-03-08 04:39:50 +0000 |
commit | a90e9c1f8d3a451fdd5a7191fe00ae40a874696b (patch) | |
tree | d002e797372d82344a3e7b17a1e8e59b137eed84 /lib/general.c | |
parent | 3c7ebc627fbabff3871fbc66912c4adddedda754 (diff) | |
download | lm-sensors-a90e9c1f8d3a451fdd5a7191fe00ae40a874696b.tar.gz |
Patch by Philipp Thomas <pth@suse.de>:
> Current gcc versions warn when type punning is used, as this breaks the
> strict aliasing analysis gcc 3.3 does by default. When checking the causes
> for these warnings I discovered that sensors_malloc_array,
> sensors_free_array, sensors_add_array_el and sensors_add_array_els in
> lib/general.c all take a 'void **' for the list. This is plain wrong as
> the C standard only allow 'char *' and 'void *' to alias any other type, so
> if these functions should take a generic pointer, it *must* be a 'void *'
> that's internally cast to a 'void **'.
>
> The attached patch does this and adapts all places where these functions are
> called. Note that when done correctly, no cast what-so-ever in the calling
> code is needed.
>
> The patch is against current lm_sensors2 cvs version.
git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2345 7894878c-1315-0410-8ee3-d5d059ff63e0
Diffstat (limited to 'lib/general.c')
-rw-r--r-- | lib/general.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/lib/general.c b/lib/general.c index bc15695a..9374b58c 100644 --- a/lib/general.c +++ b/lib/general.c @@ -27,51 +27,57 @@ #define A_BUNCH 16 -void sensors_malloc_array(void **list, int *num_el, int *max_el, int el_size) +void sensors_malloc_array(void *list, int *num_el, int *max_el, int el_size) { - *list = malloc(el_size*A_BUNCH); - if (! *list) + void **my_list = (void **)list; + + *my_list = malloc(el_size*A_BUNCH); + if (! *my_list) sensors_fatal_error("sensors_malloc_array","Allocating new elements"); *max_el = A_BUNCH; *num_el = 0; } -void sensors_free_array(void **list, int *num_el, int *max_el) +void sensors_free_array(void *list, int *num_el, int *max_el) { - free(*list); - *list = NULL; + void **my_list = (void **)list; + + free(*my_list); + *my_list = NULL; *num_el = 0; *max_el = 0; } -void sensors_add_array_el(const void *el, void **list, int *num_el, +void sensors_add_array_el(const void *el, void *list, int *num_el, int *max_el, int el_size) { int new_max_el; + void **my_list = (void *)list; if (*num_el + 1 > *max_el) { new_max_el = *max_el + A_BUNCH; - *list = realloc(*list,new_max_el * el_size); - if (! *list) + *my_list = realloc(*my_list,new_max_el * el_size); + if (! *my_list) sensors_fatal_error("sensors_add_array_el","Allocating new elements"); *max_el = new_max_el; } - memcpy(((char *) *list) + *num_el * el_size, el, el_size); + memcpy(((char *) *my_list) + *num_el * el_size, el, el_size); (*num_el) ++; } -void sensors_add_array_els(const void *els, int nr_els, void **list, +void sensors_add_array_els(const void *els, int nr_els, void *list, int *num_el, int *max_el, int el_size) { int new_max_el; + void **my_list = (void *)list; if (*num_el + nr_els > *max_el) { new_max_el = (*max_el + nr_els + A_BUNCH); new_max_el -= new_max_el % A_BUNCH; - *list = realloc(*list,new_max_el * el_size); - if (! *list) + *my_list = realloc(*my_list,new_max_el * el_size); + if (! *my_list) sensors_fatal_error("sensors_add_array_els","Allocating new elements"); *max_el = new_max_el; } - memcpy(((char *)*list) + *num_el * el_size, els, el_size * nr_els); + memcpy(((char *)*my_list) + *num_el * el_size, els, el_size * nr_els); *num_el += nr_els; } |