re PR sanitizer/64741 (Incorrect size of UBSan type descriptors)
authorJakub Jelinek <jakub@redhat.com>
Tue, 27 Jan 2015 09:58:00 +0000 (10:58 +0100)
committerYury Gribov <ygribov@gcc.gnu.org>
Tue, 27 Jan 2015 09:58:00 +0000 (09:58 +0000)
2015-01-27  Jakub Jelinek  <jakub@redhat.com>
    Yury Gribov  <y.gribov@samsung.com>

PR ubsan/64741
* ubsan.c (ubsan_source_location): Refactor code.
(ubsan_type_descriptor): Update type size. Refactor code.

Co-Authored-By: Yury Gribov <y.gribov@samsung.com>
From-SVN: r220159

gcc/ChangeLog
gcc/ubsan.c

index 7972a4dc29d73cf8285de89e0c9c20bc7abba082..9a7d5535adb551299d021d12c5815867123b644d 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-27  Jakub Jelinek  <jakub@redhat.com>
+           Yury Gribov  <y.gribov@samsung.com>
+
+       PR ubsan/64741
+       * ubsan.c (ubsan_source_location): Refactor code.
+       (ubsan_type_descriptor): Update type size. Refactor code.
+
 2015-01-27  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/56273
index a9df290a7295df156749fc0765d044f894933862..036e67e787971cedfe9527cc03a7e357d0c5e632 100644 (file)
@@ -328,10 +328,9 @@ ubsan_source_location (location_t loc)
   else
     {
       /* Fill in the values from LOC.  */
-      size_t len = strlen (xloc.file);
-      str = build_string (len + 1, xloc.file);
-      TREE_TYPE (str) = build_array_type (char_type_node,
-                                         build_index_type (size_int (len)));
+      size_t len = strlen (xloc.file) + 1;
+      str = build_string (len, xloc.file);
+      TREE_TYPE (str) = build_array_type_nelts (char_type_node, len);
       TREE_READONLY (str) = 1;
       TREE_STATIC (str) = 1;
       str = build_fold_addr_expr (str);
@@ -504,6 +503,13 @@ ubsan_type_descriptor (tree type, enum ubsan_print_style pstyle)
   tinfo = get_ubsan_type_info_for_type (type);
 
   /* Create a new VAR_DECL of type descriptor.  */
+  const char *tmp = pp_formatted_text (&pretty_name);
+  size_t len = strlen (tmp) + 1;
+  tree str = build_string (len, tmp);
+  TREE_TYPE (str) = build_array_type_nelts (char_type_node, len);
+  TREE_READONLY (str) = 1;
+  TREE_STATIC (str) = 1;
+
   char tmp_name[32];
   static unsigned int type_var_id_num;
   ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_type", type_var_id_num++);
@@ -514,14 +520,12 @@ ubsan_type_descriptor (tree type, enum ubsan_print_style pstyle)
   DECL_ARTIFICIAL (decl) = 1;
   DECL_IGNORED_P (decl) = 1;
   DECL_EXTERNAL (decl) = 0;
+  DECL_SIZE (decl)
+    = size_binop (PLUS_EXPR, DECL_SIZE (decl), TYPE_SIZE (TREE_TYPE (str)));
+  DECL_SIZE_UNIT (decl)
+    = size_binop (PLUS_EXPR, DECL_SIZE_UNIT (decl),
+                 TYPE_SIZE_UNIT (TREE_TYPE (str)));
 
-  const char *tmp = pp_formatted_text (&pretty_name);
-  size_t len = strlen (tmp);
-  tree str = build_string (len + 1, tmp);
-  TREE_TYPE (str) = build_array_type (char_type_node,
-                                     build_index_type (size_int (len)));
-  TREE_READONLY (str) = 1;
-  TREE_STATIC (str) = 1;
   tree ctor = build_constructor_va (dtype, 3, NULL_TREE,
                                    build_int_cst (short_unsigned_type_node,
                                                   tkind), NULL_TREE,