[PATCH] gcc warnings again

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hello.
yesterday i tried rebuilding both mdadm 3.1.5 and 3.2.1 with gcc 4.6,
with the following CXFLAGS

x86:    -O2 -g -frecord-gcc-switches -Wstrict-aliasing=2 -pipe -Wformat
-Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
--param=ssp-buffer-size=4 -fomit-frame-pointer -mtune=generic
-march=i586 -fasynchronous-unwind-tables

x86_64: -O2 -g -frecord-gcc-switches -Wstrict-aliasing=2 -pipe -Wformat
-Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
--param=ssp-buffer-size=4 -fPIC

i found a good number of warnings
unused but set variable
strict aliasing
comparison between signed and unsigned values *on 32bit*

for the unused variables i found fedora already had a patch which is
sensible enough, i did not see it reported here, so i will attach it.

I know -Wstrict-aliasing=2 can give false positive but those looked real
to me, so i fixed those.

looking at the gpt code in util.c i found i did not like it at all, a
gpt partition entry is currently 128 bytes, but the spec does not say it
is a fixed value, so the code that reads into a buffer with 512bytes
chunk expecting this to be a multiplier of part_size is imho incorrect.
my fix was to read each partition entry directly into a struct
GPT_part_entry, the advantage is that the code is very simple to read,
the disadvantage it is 128 reads of 128 bytes each, which is
sub-optimal, but i believe readahead will mitigate this a lot.

regards,
L.


--
Luca Berra -- bluca@xxxxxxxxxx
--- mdadm-3.2.1/sysfs.c.param	2011-03-28 11:28:13.599402233 -0400
+++ mdadm-3.2.1/sysfs.c	2011-03-28 11:48:02.593714836 -0400
@@ -418,7 +418,7 @@ int sysfs_set_num(struct mdinfo *sra, st
 int sysfs_uevent(struct mdinfo *sra, char *event)
 {
 	char fname[50];
-	int n;
+	unsigned int n;
 	int fd;
 
 	sprintf(fname, "/sys/block/%s/uevent",
@@ -428,6 +428,11 @@ int sysfs_uevent(struct mdinfo *sra, cha
 		return -1;
 	n = write(fd, event, strlen(event));
 	close(fd);
+	if (n != strlen(event)) {
+		dprintf(Name ": failed to write '%s' to '%s' (%s)\n",
+			event, fname, strerror(errno));
+		return -1;
+	}
 	return 0;
 }	
 
--- mdadm-3.2.1/mdadm.c.param	2011-03-28 10:38:12.035258787 -0400
+++ mdadm-3.2.1/mdadm.c	2011-03-28 10:39:33.346082070 -0400
@@ -103,7 +103,9 @@ int main(int argc, char *argv[])
 	char *shortopt = short_options;
 	int dosyslog = 0;
 	int rebuild_map = 0;
+#if 0
 	int auto_update_home = 0;
+#endif
 	char *subarray = NULL;
 	char *remove_path = NULL;
 	char *udev_filename = NULL;
@@ -1325,11 +1327,13 @@ int main(int argc, char *argv[])
 							cnt++;
 							acnt++;
 						}
+#if 0
 						if (rv2 == 1)
 							/* found something so even though assembly failed  we
 							 * want to avoid auto-updates
 							 */
 							auto_update_home = 0;
+#endif
 					} while (rv2!=2);
 					/* Incase there are stacked devices, we need to go around again */
 				} while (acnt);
--- mdadm-3.2.1/mdmon.c.param	2011-03-28 11:29:41.128681560 -0400
+++ mdadm-3.2.1/mdmon.c	2011-03-28 11:30:54.514946394 -0400
@@ -513,6 +513,9 @@ static int mdmon(char *devname, int devn
 	ignore = dup(0);
 #endif
 
+	if (ignore)
+		ignore++;
+
 	do_manager(container);
 
 	exit(0);
--- mdadm-3.2.1/Grow.c.param	2011-03-28 10:38:12.038259001 -0400
+++ mdadm-3.2.1/Grow.c	2011-03-28 10:45:28.174500010 -0400
@@ -1312,7 +1312,6 @@ int Grow_reshape(char *devname, int fd, 
 	char *subarray = NULL;
 
 	int frozen;
-	int changed = 0;
 	char *container = NULL;
 	char container_buf[20];
 	int cfd = -1;
@@ -1479,7 +1478,6 @@ int Grow_reshape(char *devname, int fd, 
 		if (!quiet)
 			fprintf(stderr, Name ": component size of %s has been set to %lluK\n",
 				devname, size);
-		changed = 1;
 	} else if (array.level != LEVEL_CONTAINER) {
 		size = get_component_size(fd)/2;
 		if (size == 0)
--- mdadm-3.2.1/Query.c.param	2011-03-28 10:38:12.040259145 -0400
+++ mdadm-3.2.1/Query.c	2011-03-28 10:41:19.272668999 -0400
@@ -35,7 +35,7 @@ int Query(char *dev)
 	int fd = open(dev, O_RDONLY);
 	int vers;
 	int ioctlerr;
-	int superror, superrno;
+	int superror;
 	struct mdinfo info;
 	mdu_array_info_t array;
 	struct supertype *st = NULL;
@@ -84,7 +84,6 @@ int Query(char *dev)
 	st = guess_super(fd);
 	if (st) {
 		superror = st->ss->load_super(st, fd, dev);
-		superrno = errno;
 	} else
 		superror = -1;
 	close(fd);
--- mdadm-3.2.1/super1.c.param	2011-03-28 10:38:12.043259360 -0400
+++ mdadm-3.2.1/super1.c	2011-03-28 10:53:14.423905054 -0400
@@ -111,7 +111,6 @@ static unsigned int calc_sb_1_csum(struc
 	unsigned long long newcsum;
 	int size = sizeof(*sb) + __le32_to_cpu(sb->max_dev)*2;
 	unsigned int *isuper = (unsigned int*)sb;
-	int i;
 
 /* make sure I can count... */
 	if (offsetof(struct mdp_superblock_1,data_offset) != 128 ||
@@ -123,7 +122,7 @@ static unsigned int calc_sb_1_csum(struc
 	disk_csum = sb->sb_csum;
 	sb->sb_csum = 0;
 	newcsum = 0;
-	for (i=0; size>=4; size -= 4 ) {
+	for (; size>=4; size -= 4 ) {
 		newcsum += __le32_to_cpu(*isuper);
 		isuper++;
 	}
@@ -387,15 +386,11 @@ static void examine_super1(struct supert
 	printf("   Array State : ");
 	for (d=0; d<__le32_to_cpu(sb->raid_disks) + delta_extra; d++) {
 		int cnt = 0;
-		int me = 0;
 		unsigned int i;
 		for (i=0; i< __le32_to_cpu(sb->max_dev); i++) {
 			unsigned int role = __le16_to_cpu(sb->dev_roles[i]);
-			if (role == d) {
-				if (i == __le32_to_cpu(sb->dev_number))
-					me = 1;
+			if (role == d)
 				cnt++;
-			}
 		}
 		if (cnt > 1) printf("?");
 		else if (cnt == 1) printf("A");
--- mdadm-3.2.1/Incremental.c.param	2011-03-28 10:38:12.045259502 -0400
+++ mdadm-3.2.1/Incremental.c	2011-03-28 11:31:41.924347665 -0400
@@ -707,7 +707,7 @@ static int count_active(struct supertype
 	int cnt = 0;
 	__u64 max_events = 0;
 	char *avail = NULL;
-	int *best;
+	int *best = NULL;
 	char *devmap = NULL;
 	int numdevs = 0;
 	int devnum;
--- mdadm-3.2.1/super-intel.c.param	2011-03-28 10:38:12.048259718 -0400
+++ mdadm-3.2.1/super-intel.c	2011-03-28 11:33:53.898816208 -0400
@@ -6164,7 +6164,7 @@ static int apply_takeover_update(struct 
 {
 	struct imsm_dev *dev = NULL;
 	struct intel_dev *dv;
-	struct imsm_dev *dev_new;
+	struct imsm_dev *dev_new = NULL;
 	struct imsm_map *map;
 	struct dl *dm, *du;
 	int i;
@@ -7008,7 +7008,7 @@ static int imsm_create_metadata_update_f
 	int update_memory_size = 0;
 	struct imsm_update_reshape *u = NULL;
 	struct mdinfo *spares = NULL;
-	int i;
+	int i = -1;
 	int delta_disks = 0;
 	struct mdinfo *dev;
 
Workaround for strict-aliasing warning

Signed-off-by: Luca Berra <bluca@xxxxxxxx>
---

--- mdadm-3.2.1/Grow.c.strictalias	2011-06-15 14:46:48.281409916 +0000
+++ mdadm-3.2.1/Grow.c	2011-06-15 14:46:48.321410099 +0000
@@ -2914,6 +2914,7 @@ int child_monitor(int afd, struct mdinfo
 	int chunk = sra->array.chunk_size;
 	struct mdinfo *sd;
 	unsigned long stripes;
+	int uuid[4];
 
 	/* set up the backup-super-block.  This requires the
 	 * uuid from the array.
@@ -2941,7 +2942,8 @@ int child_monitor(int afd, struct mdinfo
 
 	memset(&bsb, 0, 512);
 	memcpy(bsb.magic, "md_backup_data-1", 16);
-	st->ss->uuid_from_super(st, (int*)&bsb.set_uuid);
+	st->ss->uuid_from_super(st, uuid);
+	memcpy(bsb.set_uuid, uuid, 16);
 	bsb.mtime = __cpu_to_le64(time(0));
 	bsb.devstart2 = blocks;
 
--- mdadm-3.2.1/super0.c.strictalias	2011-03-28 02:31:20.000000000 +0000
+++ mdadm-3.2.1/super0.c	2011-06-15 14:46:48.321410099 +0000
@@ -423,6 +423,7 @@ static int update_super0(struct supertyp
 	 * ignored.
 	 */
 	int rv = 0;
+	int uuid[4];
 	mdp_super_t *sb = st->sb;
 	if (strcmp(update, "sparc2.2")==0 ) {
 		/* 2.2 sparc put the events in the wrong place
@@ -561,7 +562,8 @@ static int update_super0(struct supertyp
 		if (sb->state & (1<<MD_SB_BITMAP_PRESENT)) {
 			struct bitmap_super_s *bm;
 			bm = (struct bitmap_super_s*)(sb+1);
-			uuid_from_super0(st, (int*)bm->uuid);
+			uuid_from_super0(st, uuid);
+			memcpy(bm->uuid, uuid, 16);
 		}
 	} else if (strcmp(update, "no-bitmap") == 0) {
 		sb->state &= ~(1<<MD_SB_BITMAP_PRESENT);
@@ -987,6 +989,7 @@ static int add_internal_bitmap0(struct s
 	int chunk = *chunkp;
 	mdp_super_t *sb = st->sb;
 	bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MD_SB_BYTES);
+	int uuid[4];
 
 
 	min_chunk = 4096; /* sub-page chunks don't work yet.. */
@@ -1010,7 +1013,8 @@ static int add_internal_bitmap0(struct s
 	memset(bms, 0, sizeof(*bms));
 	bms->magic = __cpu_to_le32(BITMAP_MAGIC);
 	bms->version = __cpu_to_le32(major);
-	uuid_from_super0(st, (int*)bms->uuid);
+	uuid_from_super0(st, uuid);
+	memcpy(bms->uuid, uuid, 16);
 	bms->chunksize = __cpu_to_le32(chunk);
 	bms->daemon_sleep = __cpu_to_le32(delay);
 	bms->sync_size = __cpu_to_le64(size);
--- mdadm-3.2.1/super1.c.strictalias	2011-06-15 14:46:48.281409916 +0000
+++ mdadm-3.2.1/super1.c	2011-06-15 14:46:48.321410099 +0000
@@ -1492,6 +1492,7 @@ add_internal_bitmap1(struct supertype *s
 	int room = 0;
 	struct mdp_superblock_1 *sb = st->sb;
 	bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + 1024);
+	int uuid[4];
 
 	switch(st->minor_version) {
 	case 0:
@@ -1579,7 +1580,8 @@ add_internal_bitmap1(struct supertype *s
 	memset(bms, 0, sizeof(*bms));
 	bms->magic = __cpu_to_le32(BITMAP_MAGIC);
 	bms->version = __cpu_to_le32(major);
-	uuid_from_super1(st, (int*)bms->uuid);
+	uuid_from_super1(st, uuid);
+	memcpy(bms->uuid, uuid, 16);
 	bms->chunksize = __cpu_to_le32(chunk);
 	bms->daemon_sleep = __cpu_to_le32(delay);
 	bms->sync_size = __cpu_to_le64(size);
Workaround for strict-aliasing warning
read() returns a ssize_t, not an unsigned
Rework code to not depend on assumptions about part_entry size

Signed-off-by: Luca Berra <bluca@xxxxxxxx>

--- mdadm-3.2.1/util.c.gpt	2011-03-28 02:31:20.000000000 +0000
+++ mdadm-3.2.1/util.c	2011-06-15 21:14:07.039082716 +0000
@@ -1280,9 +1280,8 @@ int must_be_container(int fd)
 static int get_gpt_last_partition_end(int fd, unsigned long long *endofpart)
 {
 	struct GPT gpt;
-	unsigned char buf[512];
 	unsigned char empty_gpt_entry[16]= {0};
-	struct GPT_part_entry *part;
+	struct GPT_part_entry part;
 	unsigned long long curr_part_end;
 	unsigned all_partitions, entry_size;
 	unsigned part_nr;
@@ -1290,8 +1289,9 @@ static int get_gpt_last_partition_end(in
 	*endofpart = 0;
 
 	BUILD_BUG_ON(sizeof(gpt) != 512);
-	/* read GPT header */
+	/* skip protective MBR */
 	lseek(fd, 512, SEEK_SET);
+	/* read GPT header */
 	if (read(fd, &gpt, 512) != 512)
 		return 0;
 
@@ -1308,28 +1308,19 @@ static int get_gpt_last_partition_end(in
 	    entry_size > 512)
 		return -1;
 
-	/* read first GPT partition entries */
-	if (read(fd, buf, 512) != 512)
-		return 0;
-
-	part = (struct GPT_part_entry*)buf;
-
 	for (part_nr=0; part_nr < all_partitions; part_nr++) {
+		/* read partition entry */
+		if (read(fd, &part, entry_size) != (ssize_t)entry_size)
+			return 0;
+
 		/* is this valid partition? */
-		if (memcmp(part->type_guid, empty_gpt_entry, 16) != 0) {
+		if (memcmp(part.type_guid, empty_gpt_entry, 16) != 0) {
 			/* check the last lba for the current partition */
-			curr_part_end = __le64_to_cpu(part->ending_lba);
+			curr_part_end = __le64_to_cpu(part.ending_lba);
 			if (curr_part_end > *endofpart)
 				*endofpart = curr_part_end;
 		}
 
-		part = (struct GPT_part_entry*)((unsigned char*)part + entry_size);
-
-		if ((unsigned char *)part >= buf + 512) {
-			if (read(fd, buf, 512) != 512)
-				return 0;
-			part = (struct GPT_part_entry*)buf;
-		}
 	}
 	return 1;
 }

[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux