Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Oct 2020 14:28:14 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r366765 - head/contrib/libgnuregex
Message-ID:  <202010161428.09GESEoj085457@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Fri Oct 16 14:28:13 2020
New Revision: 366765
URL: https://svnweb.freebsd.org/changeset/base/366765

Log:
   This fixes some fun type size truncation that shows up giving errors like
  " changes value from '287948901175001088' to '0' "
  
  .. which turns out is a known issue with later gcc's.
  
  eg - https://lists.gnu.org/archive/html/bug-gnulib/2012-03/msg00154.html
  
  It was fixed up upstream corelib/gnulib in commit hash
  252b52457da7887667c036d18cc5169777615bb0
  (eg in https://github.com/coreutils/gnulib/commit/252b52457da7887667c036d18cc5169777615bb0)
  
  TEST PLAN
    - compiled/run for gcc-6.4 on amd64
  
  Reviewed by:	imp
  Differential Revision:	https://reviews.freebsd.org/D26804

Modified:
  head/contrib/libgnuregex/regcomp.c

Modified: head/contrib/libgnuregex/regcomp.c
==============================================================================
--- head/contrib/libgnuregex/regcomp.c	Fri Oct 16 13:37:58 2020	(r366764)
+++ head/contrib/libgnuregex/regcomp.c	Fri Oct 16 14:28:13 2020	(r366765)
@@ -930,26 +930,30 @@ init_word_char (re_dfa_t *dfa)
   int ch = 0;
   if (BE (dfa->map_notascii == 0, 1))
     {
-      if (sizeof (dfa->word_char[0]) == 8)
+      /* Avoid uint32_t and uint64_t as some non-GCC platforms lack
+	 them, an issue when this code is used in Gnulib.  */
+      bitset_word_t bits0 = 0x00000000;
+      bitset_word_t bits1 = 0x03ff0000;
+      bitset_word_t bits2 = 0x87fffffe;
+      bitset_word_t bits3 = 0x07fffffe;
+
+      if (BITSET_WORD_BITS == 64)
 	{
-          /* The extra temporaries here avoid "implicitly truncated"
-             warnings in the case when this is dead code, i.e. 32-bit.  */
-          const uint64_t wc0 = UINT64_C (0x03ff000000000000);
-          const uint64_t wc1 = UINT64_C (0x07fffffe87fffffe);
-	  dfa->word_char[0] = wc0;
-	  dfa->word_char[1] = wc1;
+          /* Pacify gcc -Woverflow on 32-bit platformns.  */
+          dfa->word_char[0] = bits1 << 31 << 1 | bits0;
+          dfa->word_char[1] = bits3 << 31 << 1 | bits2;
 	  i = 2;
 	}
-      else if (sizeof (dfa->word_char[0]) == 4)
+      else if (BITSET_WORD_BITS == 32)
 	{
-	  dfa->word_char[0] = UINT32_C (0x00000000);
-	  dfa->word_char[1] = UINT32_C (0x03ff0000);
-	  dfa->word_char[2] = UINT32_C (0x87fffffe);
-	  dfa->word_char[3] = UINT32_C (0x07fffffe);
+          dfa->word_char[0] = bits0;
+          dfa->word_char[1] = bits1;
+          dfa->word_char[2] = bits2;
+          dfa->word_char[3] = bits3;
 	  i = 4;
 	}
       else
-	abort ();
+	goto general_case;
       ch = 128;
 
       if (BE (dfa->is_utf8, 1))
@@ -959,6 +963,7 @@ init_word_char (re_dfa_t *dfa)
 	}
     }
 
+general_case:
   for (; i < BITSET_WORDS; ++i)
     for (int j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
       if (isalnum (ch) || ch == '_')



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010161428.09GESEoj085457>