Hi all,
As described in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64741 ,
ASan may currently report false positives for UBSan internal variables
due to their incomplete type information. This patch fixes this.
Bootstrapped and regtested on Linux x64. Ok to commit?
-Y
commit cf083510ece7b7bde1ab5a41e293b5a6a5bb4550
Author: Yury Gribov <y.gri...@samsung.com>
Date: Mon Jan 26 10:19:03 2015 +0300
2015-01-26 Yury Gribov <y.gri...@samsung.com>
PR ubsan/64741
* ubsan.c (ubsan_type_descriptor): Update type size.
diff --git a/gcc/ubsan.c b/gcc/ubsan.c
index a9df290..7031572 100644
--- a/gcc/ubsan.c
+++ b/gcc/ubsan.c
@@ -504,6 +504,14 @@ 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);
+ 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;
+
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 +522,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,