re PR c/67410 (c/c-typeck.c references out of bounds array)
authorJakub Jelinek <jakub@redhat.com>
Fri, 12 Aug 2016 16:04:33 +0000 (18:04 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 12 Aug 2016 16:04:33 +0000 (18:04 +0200)
PR c/67410
* c-typeck.c (set_nonincremental_init_from_string): Use / instead of
% to determine val element to change.  Assert that
wchar_bytes * charwidth fits into val array.

* gcc.dg/pr67410.c: New test.

Co-Authored-By: Martin Liska <mliska@suse.cz>
From-SVN: r239419

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr67410.c [new file with mode: 0644]

index 62701f0e493c52020fdaa7c30b7e810fb8af66c9..522da71ff6423aa7bb793b0a78c2910166a4ec2b 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-12  Jakub Jelinek  <jakub@redhat.com>
+           Martin Liska  <mliska@suse.cz>
+
+       PR c/67410
+       * c-typeck.c (set_nonincremental_init_from_string): Use / instead of
+       % to determine val element to change.  Assert that
+       wchar_bytes * charwidth fits into val array.
+
 2016-08-12  Marek Polacek  <polacek@redhat.com>
 
        PR c/7652
index 8456a0c0b1e816003605815b308295857e7842fc..2e1e09dab00c99be368b2e6f2679afb1ed6aaef1 100644 (file)
@@ -8558,6 +8558,8 @@ set_nonincremental_init_from_string (tree str,
 
   wchar_bytes = TYPE_PRECISION (TREE_TYPE (TREE_TYPE (str))) / BITS_PER_UNIT;
   charwidth = TYPE_PRECISION (char_type_node);
+  gcc_assert ((size_t) wchar_bytes * charwidth
+             <= ARRAY_SIZE (val) * HOST_BITS_PER_WIDE_INT);
   type = TREE_TYPE (constructor_type);
   p = TREE_STRING_POINTER (str);
   end = p + TREE_STRING_LENGTH (str);
@@ -8583,7 +8585,7 @@ set_nonincremental_init_from_string (tree str,
                bitpos = (wchar_bytes - byte - 1) * charwidth;
              else
                bitpos = byte * charwidth;
-             val[bitpos % HOST_BITS_PER_WIDE_INT]
+             val[bitpos / HOST_BITS_PER_WIDE_INT]
                |= ((unsigned HOST_WIDE_INT) ((unsigned char) *p++))
                   << (bitpos % HOST_BITS_PER_WIDE_INT);
            }
index 5ad718d134e362dd962f270a24476cbf4264d29c..8040f34e775c33243101bb5e1cda2d597290b9c3 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c/67410
+       * gcc.dg/pr67410.c: New test.
+
 2016-08-12  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/69848
diff --git a/gcc/testsuite/gcc.dg/pr67410.c b/gcc/testsuite/gcc.dg/pr67410.c
new file mode 100644 (file)
index 0000000..ff3c4f1
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR c/67410 */
+/* { dg-do run } */
+/* { dg-options "-std=gnu11" } */
+
+struct {
+  __CHAR16_TYPE__ s[2];
+} a[] = { u"ff", [0].s[0] = u'x', [1] = u"\u1234\u4567", [1].s[0] = u'\u89ab' };
+
+int
+main ()
+{
+  if (a[0].s[0] != u'x' || a[0].s[1] != u'f' || a[1].s[0] != u'\u89ab' || a[1].s[1] != u'\u4567')
+    __builtin_abort ();
+  return 0;
+}