summaryrefslogtreecommitdiff
path: root/lib/general.c
diff options
context:
space:
mode:
authormmh <mmh@7894878c-1315-0410-8ee3-d5d059ff63e0>2004-03-08 04:39:50 +0000
committermmh <mmh@7894878c-1315-0410-8ee3-d5d059ff63e0>2004-03-08 04:39:50 +0000
commita90e9c1f8d3a451fdd5a7191fe00ae40a874696b (patch)
treed002e797372d82344a3e7b17a1e8e59b137eed84 /lib/general.c
parent3c7ebc627fbabff3871fbc66912c4adddedda754 (diff)
downloadlm-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.c34
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;
}