On 22.02.2012 19:41, Lennart Sorensen wrote:
On Wed, Feb 22, 2012 at 01:28:06PM -0500, Lennart Sorensen wrote:
Oh the feature for doing multiple #pragma statements throughout the code
is new in gcc 4.6.  It can't be done in earlier versions.  In older
versions whatever you say last applies to the whole file.

Perhaps a slightly ugly solution could solve it by having a #if that
checks that gcc is 4.6 or higher around the #pragma that reenables
the warning.

ie:

#if __GNUC__>  4 || (__GNUC__ == 4&&  __GNUC_MINOR__>= 6)
#pragma GCC diagnostic error "-Wunsafe-loop-optimizations"
#endif

At least this way you get to have the warning for most of the code on
newer gcc versions, but don't break older gcc versions that are still
in common use.
Well it compiles when I do that at least with gcc 4.4, although obviously
it does mean -Wunsafe-loop-optimizations is disabled entirely for those
4 files rather than just for the one function that causes a problem.
Alternative is to add a condition which will ensure the loop termination but don't interfere with it other wise by using the fact that min (UINT_MAX, r)=r if r is unsigned int.


--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko

=== modified file 'conf/Makefile.common'
--- conf/Makefile.common	2012-02-22 15:27:39 +0000
+++ conf/Makefile.common	2012-02-22 17:26:03 +0000
@@ -104,7 +104,7 @@
 CFLAGS_GCRY = -Wno-error -Wno-missing-field-initializers
 CPPFLAGS_GCRY = -I$(top_srcdir)/grub-core/lib/libgcrypt_wrap
 
-CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion -Wno-old-style-definition
+CFLAGS_GNULIB = -Wno-undef -Wno-sign-compare -Wno-unused -Wno-unused-parameter -Wno-redundant-decls -Wno-unreachable-code -Wno-conversion -Wno-old-style-definition -Wno-unsafe-loop-optimizations
 CPPFLAGS_GNULIB = -I$(top_builddir)/grub-core/gnulib -I$(top_srcdir)/grub-core/gnulib
 
 CFLAGS_POSIX = -fno-builtin

=== modified file 'configure.ac'
--- configure.ac	2012-02-22 03:56:45 +0000
+++ configure.ac	2012-02-22 16:51:06 +0000
@@ -377,9 +377,9 @@
 LIBS=""
 
 # debug flags.
-WARN_FLAGS="-Wall -W -Wshadow -Wold-style-declaration -Wold-style-definition -Wpointer-arith -Wundef -Wextra -Waddress -Warray-bounds -Wattributes -Wbuiltin-macro-redefined -Wcast-align -Wchar-subscripts -Wclobbered -Wcomment -Wcoverage-mismatch -Wdeprecated -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wempty-body -Wendif-labels -Wfloat-equal -Wformat-contains-nul -Wformat-extra-args -Wformat-security -Wformat-y2k -Wignored-qualifiers -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-noreturn -Wmudflap -Wmultichar -Wnonnull -Woverflow -Wpacked-bitfield-compat -Wparentheses -Wpointer-arith -Wpointer-to-int-cast -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstrict-aliasing -Wswitch -Wsync-nand -Wtrigraphs  -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value  -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wmissing-declarations -Wmissing-parameter-type  -Wmissing-prototypes -Wnested-externs -Wstrict-prototypes -Wpointer-sign"
+WARN_FLAGS="-Wall -W -Wshadow -Wold-style-declaration -Wold-style-definition -Wpointer-arith -Wundef -Wextra -Waddress -Warray-bounds -Wattributes -Wbuiltin-macro-redefined -Wcast-align -Wchar-subscripts -Wclobbered -Wcomment -Wcoverage-mismatch -Wdeprecated -Wdeprecated-declarations -Wdisabled-optimization -Wdiv-by-zero -Wempty-body -Wendif-labels -Wfloat-equal -Wformat-contains-nul -Wformat-extra-args -Wformat-security -Wformat-y2k -Wignored-qualifiers -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Winit-self -Wint-to-pointer-cast -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-noreturn -Wmudflap -Wmultichar -Wnonnull -Woverflow -Wpacked-bitfield-compat -Wparentheses -Wpointer-arith -Wpointer-to-int-cast -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wstrict-aliasing -Wswitch -Wsync-nand -Wtrigraphs  -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value  -Wunused-variable -Wvariadic-macros -Wvolatile-register-var -Wwrite-strings -Wmissing-parameter-type -Wnested-externs -Wstrict-prototypes -Wpointer-sign"
 HOST_CFLAGS="$HOST_CFLAGS $WARN_FLAGS"
-TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes"
+TARGET_CFLAGS="$TARGET_CFLAGS $WARN_FLAGS -g -Wredundant-decls -Wmissing-prototypes -Wmissing-declarations"
 TARGET_CCASFLAGS="$TARGET_CCASFLAGS -g"
 
 # Force no alignment to save space on i386.

=== modified file 'grub-core/commands/legacycfg.c'
--- grub-core/commands/legacycfg.c	2012-02-12 14:25:25 +0000
+++ grub-core/commands/legacycfg.c	2012-02-22 18:58:57 +0000
@@ -543,15 +543,17 @@
   grub_uint8_t hash[MD5_HASHLEN];
 };
 
+#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+
 static int
 check_password_md5_real (const char *entered,
 			 struct legacy_md5_password *pw)
 {
-  int enteredlen = grub_strlen (entered);
+  grub_size_t enteredlen = grub_strlen (entered);
   unsigned char alt_result[MD5_HASHLEN];
   unsigned char *digest;
   grub_uint8_t ctx[GRUB_MD_MD5->contextsize];
-  int i;
+  grub_size_t i;
 
   GRUB_MD_MD5->init (ctx);
   GRUB_MD_MD5->write (ctx, entered, enteredlen);

=== modified file 'grub-core/commands/testload.c'
--- grub-core/commands/testload.c	2012-02-22 04:04:54 +0000
+++ grub-core/commands/testload.c	2012-02-22 16:25:36 +0000
@@ -77,19 +77,24 @@
   grub_printf ("Reading %s sequentially again", argv[0]);
   grub_file_seek (file, 0);
 
-  for (pos = 0; pos < size; pos += GRUB_DISK_SECTOR_SIZE)
+  for (pos = 0; pos < size;)
     {
       char sector[GRUB_DISK_SECTOR_SIZE];
-
-      if (grub_file_read (file, sector, GRUB_DISK_SECTOR_SIZE)
-	  != GRUB_DISK_SECTOR_SIZE)
+      grub_size_t curlen = GRUB_DISK_SECTOR_SIZE;
+
+      if (curlen > size - pos)
+	curlen = size - pos;
+
+      if (grub_file_read (file, sector, curlen)
+	  != (grub_ssize_t) curlen)
 	goto fail;
 
-      if (grub_memcmp (sector, buf + pos, GRUB_DISK_SECTOR_SIZE) != 0)
+      if (grub_memcmp (sector, buf + pos, curlen) != 0)
 	{
 	  grub_printf ("\nDiffers in %lld\n", (unsigned long long) pos);
 	  goto fail;
 	}
+      pos += curlen;
     }
   grub_printf (" Done.\n");
 

=== modified file 'grub-core/disk/ldm.c'
--- grub-core/disk/ldm.c	2012-02-10 11:36:02 +0000
+++ grub-core/disk/ldm.c	2012-02-22 17:26:19 +0000
@@ -831,7 +831,7 @@
 {
   struct grub_diskfilter_pv *pv = NULL;
   struct grub_diskfilter_vg *vg = NULL;
-  struct grub_diskfilter_lv *res, *lv;
+  struct grub_diskfilter_lv *res = 0, *lv, *res_lv = 0;
 
   pv = grub_diskfilter_get_pv_from_disk (disk, &vg);
 
@@ -844,19 +844,21 @@
 	&& lv->segments->nodes->pv == pv
 	&& lv->segments->nodes->start + pv->start_sector == start)
       {
-	res = lv;
+	res_lv = lv;
 	break;
       }
+  if (!res_lv)
+    return NULL;
   for (lv = vg->lvs; lv; lv = lv->next)
     if (lv->segment_count == 1 && lv->segments->node_count == 1
 	&& lv->segments->type == GRUB_DISKFILTER_MIRROR
-	&& lv->segments->nodes->lv == lv)
+	&& lv->segments->nodes->lv == res_lv)
       {
 	res = lv;
 	break;
       }
-  if (res->fullname)
-    return grub_strdup (lv->fullname);
+  if (res && res->fullname)
+    return grub_strdup (res->fullname);
   return NULL;
 }
 

=== modified file 'grub-core/fs/zfs/zfs_sha256.c'
--- grub-core/fs/zfs/zfs_sha256.c	2010-12-01 21:55:26 +0000
+++ grub-core/fs/zfs/zfs_sha256.c	2012-02-22 16:17:39 +0000
@@ -129,7 +129,7 @@
   for (i = 0; i < 8; i++)
     pad[padsize++] = (size << 3) >> (56 - 8 * i);
   
-  for (i = 0; i < padsize; i += 64)
+  for (i = 0; i < padsize && i <= 64; i += 64)
     SHA256Transform(H, pad + i);
   
   zcp->zc_word[0] = grub_cpu_to_zfs64 ((grub_uint64_t)H[0] << 32 | H[1], 

=== modified file 'grub-core/io/gzio.c'
--- grub-core/io/gzio.c	2012-02-12 14:25:25 +0000
+++ grub-core/io/gzio.c	2012-02-22 16:45:45 +0000
@@ -363,6 +363,8 @@
   0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
 };
 
+#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+
 #define NEEDBITS(n) do {while(k<(n)){b|=((ulg)get_byte(gzio))<<k;k+=8;}} while (0)
 #define DUMPBITS(n) do {b>>=(n);k-=(n);} while (0)
 

=== modified file 'grub-core/lib/LzmaEnc.c'
--- grub-core/lib/LzmaEnc.c	2012-02-10 15:48:48 +0000
+++ grub-core/lib/LzmaEnc.c	2012-02-22 16:16:26 +0000
@@ -1211,7 +1211,7 @@
       {
         UInt32 i;
         reps[0] = prevOpt->backs[pos];
-        for (i = 1; i <= pos; i++)
+        for (i = 1; i < pos + 1; i++)
           reps[i] = prevOpt->backs[i - 1];
         for (; i < LZMA_NUM_REPS; i++)
           reps[i] = prevOpt->backs[i];

=== modified file 'grub-core/net/net.c'
--- grub-core/net/net.c	2012-02-21 15:16:45 +0000
+++ grub-core/net/net.c	2012-02-22 18:55:00 +0000
@@ -608,8 +608,8 @@
 			struct grub_net_network_level_interface **interf)
 {
   struct grub_net_route *route;
-  int depth = 0;
-  int routecnt = 0;
+  unsigned int depth = 0;
+  unsigned int routecnt = 0;
   struct grub_net_network_level_protocol *prot = NULL;
   grub_net_network_level_address_t curtarget = addr;
 
@@ -618,7 +618,7 @@
   FOR_NET_ROUTES(route)
     routecnt++;
 
-  for (depth = 0; depth < routecnt + 2; depth++)
+  for (depth = 0; depth < routecnt + 2 && depth < GRUB_UINT_MAX; depth++)
     {
       struct grub_net_route *bestroute = NULL;
       FOR_NET_ROUTES(route)

=== modified file 'grub-core/normal/charset.c'
--- grub-core/normal/charset.c	2012-02-22 04:19:11 +0000
+++ grub-core/normal/charset.c	2012-02-22 18:57:27 +0000
@@ -734,7 +734,8 @@
 	  {
 	    int right_join = 0;
 	    signed i;
-	    for (i = k - 1; i > (signed) line_start - 1; i--)
+	    for (i = k - 1; i > (signed) line_start - 1 && i > GRUB_INT_MIN;
+		 i--)
 	      {
 		enum grub_join_type join_type = get_join_type (visual[i].base);
 		if (!(visual[i].attributes

=== modified file 'grub-core/normal/cmdline.c'
--- grub-core/normal/cmdline.c	2012-02-12 18:24:23 +0000
+++ grub-core/normal/cmdline.c	2012-02-22 16:21:47 +0000
@@ -49,13 +49,13 @@
       /* Remove the lines that don't fit in the new buffer.  */
       if (newsize < hist_used)
 	{
-	  int i;
-	  int delsize = hist_used - newsize;
+	  grub_size_t i;
+	  grub_size_t delsize = hist_used - newsize;
 	  hist_used = newsize;
 
-	  for (i = 1; i <= delsize; i++)
+	  for (i = 1; i < delsize + 1; i++)
 	    {
-	      int pos = hist_end - i;
+	      grub_ssize_t pos = hist_end - i;
 	      if (pos < 0)
 		pos += hist_size;
 	      grub_free (old_hist_lines[pos]);

=== modified file 'grub-core/script/parser.y'
--- grub-core/script/parser.y	2012-02-10 15:48:48 +0000
+++ grub-core/script/parser.y	2012-02-22 17:31:45 +0000
@@ -31,6 +31,9 @@
 #include "grub_script.tab.h"
 
 #pragma GCC diagnostic ignored "-Wunreachable-code"
+#pragma GCC diagnostic ignored "-Wmissing-declarations"
+#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
+
 %}
 
 %union {

=== modified file 'grub-core/script/yylex.l'
--- grub-core/script/yylex.l	2012-02-03 10:56:49 +0000
+++ grub-core/script/yylex.l	2012-02-22 16:49:25 +0000
@@ -27,6 +27,8 @@
 
 #pragma GCC diagnostic ignored "-Wunused-parameter"
 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
+#pragma GCC diagnostic ignored "-Wmissing-declarations"
+#pragma GCC diagnostic ignored "-Wunsafe-loop-optimizations"
 
 #define yyfree    grub_lexer_yyfree
 #define yyalloc   grub_lexer_yyalloc

=== modified file 'include/grub/types.h'
--- include/grub/types.h	2012-01-29 22:27:31 +0000
+++ include/grub/types.h	2012-02-22 18:56:02 +0000
@@ -124,6 +124,7 @@
 #define GRUB_SHRT_MAX 0x7fff
 #define GRUB_UINT_MAX 4294967295U
 #define GRUB_INT_MAX 0x7fffffff
+#define GRUB_INT_MIN -0x80000000
 
 #if GRUB_CPU_SIZEOF_LONG == 8
 # define GRUB_ULONG_MAX 18446744073709551615UL

=== modified file 'util/grub-mkfont.c'
--- util/grub-mkfont.c	2012-02-10 12:31:43 +0000
+++ util/grub-mkfont.c	2012-02-22 18:56:38 +0000
@@ -717,7 +717,7 @@
 
       bitmap = glyph->bitmap;
       mask = 0x80;
-      for (y = ymax - 1; y >= ymin; y--)
+      for (y = ymax - 1; y > ymin - 1 && y > GRUB_INT_MIN; y--)
 	{
 	  int line_pos;
 

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to