From: Jakub Jelinek Date: Tue, 27 Jan 2015 09:58:00 +0000 (+0100) Subject: re PR sanitizer/64741 (Incorrect size of UBSan type descriptors) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f4bdb96a3476e1e10655173cb8df2c41ea33038e;p=gcc.git re PR sanitizer/64741 (Incorrect size of UBSan type descriptors) 2015-01-27 Jakub Jelinek Yury Gribov PR ubsan/64741 * ubsan.c (ubsan_source_location): Refactor code. (ubsan_type_descriptor): Update type size. Refactor code. Co-Authored-By: Yury Gribov From-SVN: r220159 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7972a4dc29d..9a7d5535adb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-01-27 Jakub Jelinek + Yury Gribov + + PR ubsan/64741 + * ubsan.c (ubsan_source_location): Refactor code. + (ubsan_type_descriptor): Update type size. Refactor code. + 2015-01-27 Richard Biener PR tree-optimization/56273 diff --git a/gcc/ubsan.c b/gcc/ubsan.c index a9df290a729..036e67e7879 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -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,