Patch to remove undefined C code

From: Bernd Schmidt (bernds@redhat.co.uk)
Date: Mon Oct 16 2000 - 10:57:56 EST


I've been playing with some gcc patches to detect code with undefined
behaviour of the i = i++ variety. The patch below fixes all places in
the kernel that I could find. Note that in some cases, it wasn't
entirely clear what the code intended, so I had to guess.

I haven't tested this patch at all other than to make sure it compiles.

Bernd

diff -x log.build -x .* -dru linux-2.4/drivers/i2o/i2o_core.c linux-2.4-fixed/drivers/i2o/i2o_core.c
--- linux-2.4/drivers/i2o/i2o_core.c Mon Jun 19 21:30:56 2000
+++ linux-2.4-fixed/drivers/i2o/i2o_core.c Mon Oct 16 14:52:46 2000
@@ -183,7 +183,7 @@
 static int evt_in = 0;
 static int evt_out = 0;
 static int evt_q_len = 0;
-#define MODINC(x,y) (x = x++ % y)
+#define MODINC(x,y) ((x) = ((x) + 1) % (y))
 
 /*
  * I2O configuration spinlock. This isnt a big deal for contention
diff -x log.build -x .* -dru linux-2.4/drivers/ide/alim15x3.c linux-2.4-fixed/drivers/ide/alim15x3.c
--- linux-2.4/drivers/ide/alim15x3.c Tue Jun 20 15:52:36 2000
+++ linux-2.4-fixed/drivers/ide/alim15x3.c Mon Oct 16 15:10:24 2000
@@ -171,11 +171,11 @@
                                 ((reg5yh & 0x30)>>4) + 12 );
                 }
         } else {
- p += sprintf(p, q,
- (tmp = (reg5xh & 0x03)) ? (tmp << 3) : 4,
- (tmp = ((reg5xh & 0x30)>>4)) ? (tmp << 3) : 4,
- (tmp = (reg5yh & 0x03)) ? (tmp << 3) : 4,
- (tmp = ((reg5yh & 0x30)>>4)) ? (tmp << 3) : 4 );
+ int t1 = (tmp = (reg5xh & 0x03)) ? (tmp << 3) : 4;
+ int t2 = (tmp = ((reg5xh & 0x30)>>4)) ? (tmp << 3) : 4;
+ int t3 = (tmp = (reg5yh & 0x03)) ? (tmp << 3) : 4;
+ int t4 = (tmp = ((reg5yh & 0x30)>>4)) ? (tmp << 3) : 4;
+ p += sprintf(p, q, t1, t2, t3, t4);
         }
 
 #if 0
diff -x log.build -x .* -dru linux-2.4/drivers/ide/ide-disk.c linux-2.4-fixed/drivers/ide/ide-disk.c
--- linux-2.4/drivers/ide/ide-disk.c Tue Jun 20 15:52:36 2000
+++ linux-2.4-fixed/drivers/ide/ide-disk.c Mon Oct 16 14:48:49 2000
@@ -64,8 +64,8 @@
         u16 *p = buffer;
 
         while (wcount--) {
- *p++ = *p << 8 | *p >> 8;
- *p++ = *p << 8 | *p >> 8;
+ *p = *p << 8 | *p >> 8; p++;
+ *p = *p << 8 | *p >> 8; p++;
         }
 }
 
diff -x log.build -x .* -dru linux-2.4/drivers/isdn/sc/debug.c linux-2.4-fixed/drivers/isdn/sc/debug.c
--- linux-2.4/drivers/isdn/sc/debug.c Thu Apr 2 01:21:04 1998
+++ linux-2.4-fixed/drivers/isdn/sc/debug.c Mon Oct 16 14:53:49 2000
@@ -70,6 +70,6 @@
         int i = 0;
 
         while(dn[i] != ',')
- str[i] = dn[i++];
+ str[i] = dn[i], i++;
         str[i] = 0x0;
 }
diff -x log.build -x .* -dru linux-2.4/drivers/net/tulip/tulip_core.c linux-2.4-fixed/drivers/net/tulip/tulip_core.c
--- linux-2.4/drivers/net/tulip/tulip_core.c Mon Oct 16 13:51:23 2000
+++ linux-2.4-fixed/drivers/net/tulip/tulip_core.c Mon Oct 16 15:40:12 2000
@@ -924,18 +924,20 @@
                                  i++, mclist = mclist->next)
                                 set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x1ff,
                                                 hash_table);
- for (i = 0; i < 32; i++)
- *setup_frm++ = *setup_frm++ = hash_table[i];
+ for (i = 0; i < 32; i++) {
+ *setup_frm++ = hash_table[i];
+ *setup_frm++ = hash_table[i];
+ }
                         setup_frm = &tp->setup_frame[13*6];
                 } else {
                         /* We have <= 14 addresses so we can use the wonderful
                            16 address perfect filtering of the Tulip. */
                         for (i = 0, mclist = dev->mc_list; i < dev->mc_count;
                                  i++, mclist = mclist->next) {
- eaddrs = (u16 *)mclist->dmi_addr;
- *setup_frm++ = *setup_frm++ = *eaddrs++;
- *setup_frm++ = *setup_frm++ = *eaddrs++;
- *setup_frm++ = *setup_frm++ = *eaddrs++;
+ u16 *eaddrs = (u16 *)mclist->dmi_addr;
+ *setup_frm++ = eaddrs[0]; *setup_frm++ = eaddrs[0];
+ *setup_frm++ = eaddrs[1]; *setup_frm++ = eaddrs[1];
+ *setup_frm++ = eaddrs[2]; *setup_frm++ = eaddrs[2];
                         }
                         /* Fill the unused entries with the broadcast address. */
                         memset(setup_frm, 0xff, (15-i)*12);
@@ -944,9 +946,9 @@
 
                 /* Fill the final entry with our physical address. */
                 eaddrs = (u16 *)dev->dev_addr;
- *setup_frm++ = *setup_frm++ = eaddrs[0];
- *setup_frm++ = *setup_frm++ = eaddrs[1];
- *setup_frm++ = *setup_frm++ = eaddrs[2];
+ *setup_frm++ = eaddrs[0]; *setup_frm++ = eaddrs[0];
+ *setup_frm++ = eaddrs[1]; *setup_frm++ = eaddrs[1];
+ *setup_frm++ = eaddrs[2]; *setup_frm++ = eaddrs[2];
 
                 spin_lock_irqsave(&tp->lock, flags);
 
diff -x log.build -x .* -dru linux-2.4/drivers/scsi/aha152x.c linux-2.4-fixed/drivers/scsi/aha152x.c
--- linux-2.4/drivers/scsi/aha152x.c Mon Oct 16 13:51:24 2000
+++ linux-2.4-fixed/drivers/scsi/aha152x.c Mon Oct 16 14:51:29 2000
@@ -1280,7 +1280,8 @@
                         scsi_unregister(shpnt);
                         registered_count--;
                         release_region(shpnt->io_port, IO_RANGE);
- aha152x_host[shpnt->irq - IRQ_MIN] = shpnt = 0;
+ aha152x_host[shpnt->irq - IRQ_MIN] = 0;
+ shpnt = 0;
                         continue;
                 }
                 HOSTDATA(shpnt)->swint = 0;
diff -x log.build -x .* -dru linux-2.4/drivers/scsi/wd7000.c linux-2.4-fixed/drivers/scsi/wd7000.c
--- linux-2.4/drivers/scsi/wd7000.c Mon Oct 16 13:51:24 2000
+++ linux-2.4-fixed/drivers/scsi/wd7000.c Mon Oct 16 14:52:08 2000
@@ -951,7 +951,7 @@
             break;
         }
         else
- ogmb = (++ogmb) % OGMB_CNT;
+ ogmb = (ogmb + 1) % OGMB_CNT;
     }
     restore_flags (flags);
 
diff -x log.build -x .* -dru linux-2.4/drivers/video/clgenfb.c linux-2.4-fixed/drivers/video/clgenfb.c
--- linux-2.4/drivers/video/clgenfb.c Mon Oct 16 14:48:12 2000
+++ linux-2.4-fixed/drivers/video/clgenfb.c Mon Oct 16 14:48:09 2000
@@ -997,10 +997,10 @@
                 vsync *= 2;
                 vback *= 2;
         } else if (_par->var.vmode & FB_VMODE_INTERLACED) {
- yres = ++yres / 2;
- vfront = ++vfront / 2;
- vsync = ++vsync / 2;
- vback = ++vback / 2;
+ yres = (yres + 1) / 2;
+ vfront = (vfront + 1) / 2;
+ vsync = (vsync + 1) / 2;
+ vback = (vback + 1) / 2;
         }
         _par->HorizRes = xres;
         _par->HorizTotal = (xres + hfront + hsync + hback) / 8 - 5;
diff -x log.build -x .* -dru linux-2.4/drivers/video/mdacon.c linux-2.4-fixed/drivers/video/mdacon.c
--- linux-2.4/drivers/video/mdacon.c Tue Jul 25 01:51:41 2000
+++ linux-2.4-fixed/drivers/video/mdacon.c Mon Oct 16 14:46:32 2000
@@ -422,7 +422,8 @@
 static void mdacon_invert_region(struct vc_data *c, u16 *p, int count)
 {
         for (; count > 0; count--) {
- scr_writew(scr_readw(p) ^ 0x0800, p++);
+ scr_writew(scr_readw(p) ^ 0x0800, p);
+ p++;
         }
 }
 
diff -x log.build -x .* -dru linux-2.4/fs/nfs/nfs2xdr.c linux-2.4-fixed/fs/nfs/nfs2xdr.c
--- linux-2.4/fs/nfs/nfs2xdr.c Mon May 15 20:11:10 2000
+++ linux-2.4-fixed/fs/nfs/nfs2xdr.c Mon Oct 16 16:23:56 2000
@@ -104,7 +104,8 @@
 static inline u32*
 xdr_decode_time(u32 *p, u64 *timep)
 {
- *timep = ((u64)ntohl(*p++) << 32) + (u64)ntohl(*p++);
+ u64 tmp = (u64)ntohl(*p++) << 32;
+ *timep = tmp + (u64)ntohl(*p++);
         return p;
 }
 
diff -x log.build -x .* -dru linux-2.4/fs/nfs/nfs3xdr.c linux-2.4-fixed/fs/nfs/nfs3xdr.c
--- linux-2.4/fs/nfs/nfs3xdr.c Sat Apr 1 17:04:27 2000
+++ linux-2.4-fixed/fs/nfs/nfs3xdr.c Mon Oct 16 16:24:55 2000
@@ -143,7 +143,8 @@
 static inline u32 *
 xdr_decode_time3(u32 *p, u64 *timep)
 {
- *timep = ((u64)ntohl(*p++) << 32) + (u64)ntohl(*p++);
+ u64 tmp = (u64)ntohl(*p++) << 32;
+ *timep = tmp + (u64)ntohl(*p++);
         return p;
 }
 
@@ -184,7 +185,8 @@
         p = xdr_decode_hyper(p, &fattr->size);
         p = xdr_decode_hyper(p, &fattr->du.nfs3.used);
         /* Turn remote device info into Linux-specific dev_t */
- fattr->rdev = (ntohl(*p++) << MINORBITS) | (ntohl(*p++) & MINORMASK);
+ fattr->rdev = ntohl(*p++) << MINORBITS;
+ fattr->rdev |= ntohl(*p++) & MINORMASK;
         p = xdr_decode_hyper(p, &fattr->fsid);
         p = xdr_decode_hyper(p, &fattr->fileid);
         p = xdr_decode_time3(p, &fattr->atime);
diff -x log.build -x .* -dru linux-2.4/include/linux/byteorder/big_endian.h linux-2.4-fixed/include/linux/byteorder/big_endian.h
--- linux-2.4/include/linux/byteorder/big_endian.h Thu Feb 17 17:20:13 2000
+++ linux-2.4-fixed/include/linux/byteorder/big_endian.h Mon Oct 16 15:27:03 2000
@@ -14,12 +14,12 @@
 #define __constant_ntohl(x) ((__u32)(x))
 #define __constant_htons(x) ((__u16)(x))
 #define __constant_ntohs(x) ((__u16)(x))
-#define __constant_cpu_to_le64(x) ___swab64((x))
-#define __constant_le64_to_cpu(x) ___swab64((x))
-#define __constant_cpu_to_le32(x) ___swab32((x))
-#define __constant_le32_to_cpu(x) ___swab32((x))
-#define __constant_cpu_to_le16(x) ___swab16((x))
-#define __constant_le16_to_cpu(x) ___swab16((x))
+#define __constant_cpu_to_le64(x) ___constant_swab64((x))
+#define __constant_le64_to_cpu(x) ___constant_swab64((x))
+#define __constant_cpu_to_le32(x) ___constant_swab32((x))
+#define __constant_le32_to_cpu(x) ___constant_swab32((x))
+#define __constant_cpu_to_le16(x) ___constant_swab16((x))
+#define __constant_le16_to_cpu(x) ___constant_swab16((x))
 #define __constant_cpu_to_be64(x) ((__u64)(x))
 #define __constant_be64_to_cpu(x) ((__u64)(x))
 #define __constant_cpu_to_be32(x) ((__u32)(x))
diff -x log.build -x .* -dru linux-2.4/include/linux/byteorder/little_endian.h linux-2.4-fixed/include/linux/byteorder/little_endian.h
--- linux-2.4/include/linux/byteorder/little_endian.h Mon Oct 16 14:03:26 2000
+++ linux-2.4-fixed/include/linux/byteorder/little_endian.h Mon Oct 16 15:50:56 2000
@@ -10,22 +10,22 @@
 
 #include <linux/byteorder/swab.h>
 
-#define __constant_htonl(x) ___swab32((x))
-#define __constant_ntohl(x) ___swab32((x))
-#define __constant_htons(x) ___swab16((x))
-#define __constant_ntohs(x) ___swab16((x))
+#define __constant_htonl(x) ___constant_swab32((x))
+#define __constant_ntohl(x) ___constant_swab32((x))
+#define __constant_htons(x) ___constant_swab16((x))
+#define __constant_ntohs(x) ___constant_swab16((x))
 #define __constant_cpu_to_le64(x) ((__u64)(x))
 #define __constant_le64_to_cpu(x) ((__u64)(x))
 #define __constant_cpu_to_le32(x) ((__u32)(x))
 #define __constant_le32_to_cpu(x) ((__u32)(x))
 #define __constant_cpu_to_le16(x) ((__u16)(x))
 #define __constant_le16_to_cpu(x) ((__u16)(x))
-#define __constant_cpu_to_be64(x) ___swab64((x))
-#define __constant_be64_to_cpu(x) ___swab64((x))
-#define __constant_cpu_to_be32(x) ___swab32((x))
-#define __constant_be32_to_cpu(x) ___swab32((x))
-#define __constant_cpu_to_be16(x) ___swab16((x))
-#define __constant_be16_to_cpu(x) ___swab16((x))
+#define __constant_cpu_to_be64(x) ___constant_swab64((x))
+#define __constant_be64_to_cpu(x) ___constant_swab64((x))
+#define __constant_cpu_to_be32(x) ___constant_swab32((x))
+#define __constant_be32_to_cpu(x) ___constant_swab32((x))
+#define __constant_cpu_to_be16(x) ___constant_swab16((x))
+#define __constant_be16_to_cpu(x) ___constant_swab16((x))
 #define __cpu_to_le64(x) ((__u64)(x))
 #define __le64_to_cpu(x) ((__u64)(x))
 #define __cpu_to_le32(x) ((__u32)(x))
diff -x log.build -x .* -dru linux-2.4/include/linux/byteorder/pdp_endian.h linux-2.4-fixed/include/linux/byteorder/pdp_endian.h
--- linux-2.4/include/linux/byteorder/pdp_endian.h Thu Feb 17 17:20:13 2000
+++ linux-2.4-fixed/include/linux/byteorder/pdp_endian.h Mon Oct 16 15:31:35 2000
@@ -30,22 +30,22 @@
 #include <linux/byteorder/swab.h>
 #include <linux/byteorder/swabb.h>
 
-#define __constant_htonl(x) ___swahb32((x))
-#define __constant_ntohl(x) ___swahb32((x))
-#define __constant_htons(x) ___swab16((x))
-#define __constant_ntohs(x) ___swab16((x))
+#define __constant_htonl(x) ___constant_swahb32((x))
+#define __constant_ntohl(x) ___constant_swahb32((x))
+#define __constant_htons(x) ___constant_swab16((x))
+#define __constant_ntohs(x) ___constant_swab16((x))
 #define __constant_cpu_to_le64(x) I DON'T KNOW
 #define __constant_le64_to_cpu(x) I DON'T KNOW
-#define __constant_cpu_to_le32(x) ___swahw32((x))
-#define __constant_le32_to_cpu(x) ___swahw32((x))
+#define __constant_cpu_to_le32(x) ___constant_swahw32((x))
+#define __constant_le32_to_cpu(x) ___constant_swahw32((x))
 #define __constant_cpu_to_le16(x) ((__u16)(x)
 #define __constant_le16_to_cpu(x) ((__u16)(x)
 #define __constant_cpu_to_be64(x) I DON'T KNOW
 #define __constant_be64_to_cpu(x) I DON'T KNOW
-#define __constant_cpu_to_be32(x) ___swahb32((x))
-#define __constant_be32_to_cpu(x) ___swahb32((x))
-#define __constant_cpu_to_be16(x) ___swab16((x))
-#define __constant_be16_to_cpu(x) ___swab16((x))
+#define __constant_cpu_to_be32(x) ___constant_swahb32((x))
+#define __constant_be32_to_cpu(x) ___constant_swahb32((x))
+#define __constant_cpu_to_be16(x) ___constant_swab16((x))
+#define __constant_be16_to_cpu(x) ___constant_swab16((x))
 #define __cpu_to_le64(x) I DON'T KNOW
 #define __le64_to_cpu(x) I DON'T KNOW
 #define __cpu_to_le32(x) ___swahw32((x))
diff -x log.build -x .* -dru linux-2.4/include/linux/byteorder/swab.h linux-2.4-fixed/include/linux/byteorder/swab.h
--- linux-2.4/include/linux/byteorder/swab.h Mon Oct 16 13:51:26 2000
+++ linux-2.4-fixed/include/linux/byteorder/swab.h Mon Oct 16 15:50:29 2000
@@ -19,16 +19,48 @@
  * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way.
  */
 #define ___swab16(x) \
+({ \
+ __u16 __x = (x); \
+ ((__u16)( \
+ (((__u16)(__x) & (__u16)0x00ffU) << 8) | \
+ (((__u16)(__x) & (__u16)0xff00U) >> 8) )); \
+})
+
+#define ___swab32(x) \
+({ \
+ __u32 __x = (x); \
+ ((__u32)( \
+ (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | \
+ (((__u32)(__x) & (__u32)0x0000ff00UL) << 8) | \
+ (((__u32)(__x) & (__u32)0x00ff0000UL) >> 8) | \
+ (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); \
+})
+
+#define ___swab64(x) \
+({ \
+ __u64 __x = (x); \
+ ((__u64)( \
+ (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | \
+ (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | \
+ (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | \
+ (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) << 8) | \
+ (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >> 8) | \
+ (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | \
+ (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | \
+ (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); \
+})
+
+#define ___constant_swab16(x) \
         ((__u16)( \
                 (((__u16)(x) & (__u16)0x00ffU) << 8) | \
                 (((__u16)(x) & (__u16)0xff00U) >> 8) ))
-#define ___swab32(x) \
+#define ___constant_swab32(x) \
         ((__u32)( \
                 (((__u32)(x) & (__u32)0x000000ffUL) << 24) | \
                 (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \
                 (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \
                 (((__u32)(x) & (__u32)0xff000000UL) >> 24) ))
-#define ___swab64(x) \
+#define ___constant_swab64(x) \
         ((__u64)( \
                 (__u64)(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | \
                 (__u64)(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | \
diff -x log.build -x .* -dru linux-2.4/include/linux/byteorder/swabb.h linux-2.4-fixed/include/linux/byteorder/swabb.h
--- linux-2.4/include/linux/byteorder/swabb.h Tue Sep 1 18:50:11 1998
+++ linux-2.4-fixed/include/linux/byteorder/swabb.h Mon Oct 16 15:50:43 2000
@@ -25,12 +25,26 @@
  *
  */
 
-
 #define ___swahw32(x) \
+({ \
+ __u32 __x = (x); \
+ ((__u32)( \
+ (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \
+ (((__u32)(__x) & (__u32)0xffff0000UL) >> 16) )); \
+})
+#define ___swahb32(x) \
+({ \
+ __u32 __x = (x); \
+ ((__u32)( \
+ (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \
+ (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8) )) \
+})
+
+#define ___constant_swahw32(x) \
         ((__u32)( \
                 (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \
                 (((__u32)(x) & (__u32)0xffff0000UL) >> 16) ))
-#define ___swahb32(x) \
+#define ___constant_swahb32(x) \
         ((__u32)( \
                 (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \
                 (((__u32)(x) & (__u32)0xff00ff00UL) >> 8) ))

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Oct 23 2000 - 21:00:09 EST