public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix ubsan type reporting (PR tree-optimization/65709)
@ 2015-04-09 18:11 Jakub Jelinek
  2015-04-09 18:21 ` Richard Biener
  0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2015-04-09 18:11 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches

Hi!

As can be seen on the following testcase, instrument_mem_ref (for
both -fsanitize=alignment and -fsanitize=null) has been using wrong type
to find out what is the access type - instead of the type of MEM_REF
which is the access type it was using the TREE_TYPE of MEM_REF's argument
type, which can be some arbitrary other type, either due to type punning,
or if it is a SSA_NAME it can be random other type because most pointer
types are considered type compatible in GIMPLE.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2015-04-09  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/65709
	* ubsan.c (instrument_mem_ref): Use TREE_TYPE (base) instead of
	TREE_TYPE (TREE_TYPE (t)).

	* c-c++-common/ubsan/align-9.c: New test.

--- gcc/ubsan.c.jj	2015-03-27 10:48:33.000000000 +0100
+++ gcc/ubsan.c	2015-04-09 10:05:48.841221438 +0200
@@ -1232,9 +1232,9 @@ instrument_mem_ref (tree mem, tree base,
   tree t = TREE_OPERAND (base, 0);
   if (!POINTER_TYPE_P (TREE_TYPE (t)))
     return;
-  if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_TYPE (t))) && mem != base)
+  if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (base)) && mem != base)
     ikind = UBSAN_MEMBER_ACCESS;
-  tree kind = build_int_cst (TREE_TYPE (t), ikind);
+  tree kind = build_int_cst (build_pointer_type (TREE_TYPE (base)), ikind);
   tree alignt = build_int_cst (pointer_sized_int_node, align);
   gcall *g = gimple_build_call_internal (IFN_UBSAN_NULL, 3, t, kind, alignt);
   gimple_set_location (g, gimple_location (gsi_stmt (*iter)));
--- gcc/testsuite/c-c++-common/ubsan/align-9.c.jj	2015-04-09 10:11:15.227973011 +0200
+++ gcc/testsuite/c-c++-common/ubsan/align-9.c	2015-04-09 10:13:16.857017169 +0200
@@ -0,0 +1,21 @@
+/* Limit this to known non-strict alignment targets.  */
+/* { dg-do run { target { i?86-*-linux* x86_64-*-linux* } } } */
+/* { dg-options "-O2 -fsanitize=alignment -fsanitize-recover=alignment" } */
+
+__attribute__((noinline, noclone)) void
+foo (void *p, const void *q)
+{
+  *(long int *) p = *(const long int *) q;
+}
+
+int
+main ()
+{
+  struct S { long c; char f[64]; char d; char e[2 * sizeof (long)]; char g[64]; } s;
+  __builtin_memset (&s, '\0', sizeof s);
+  foo (&s.e[0], &s.e[sizeof (long)]);
+  return 0;
+}
+
+/* { dg-output "\.c:8:\[0-9]*: \[^\n\r]*load of misaligned address 0x\[0-9a-fA-F]* for type 'const long int', which requires \[48] byte alignment.*" } */
+/* { dg-output "\.c:8:\[0-9]*: \[^\n\r]*store to misaligned address 0x\[0-9a-fA-F]* for type 'long int', which requires \[48] byte alignment" } */

	Jakub

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Fix ubsan type reporting (PR tree-optimization/65709)
  2015-04-09 18:11 [PATCH] Fix ubsan type reporting (PR tree-optimization/65709) Jakub Jelinek
@ 2015-04-09 18:21 ` Richard Biener
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Biener @ 2015-04-09 18:21 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches

On April 9, 2015 8:11:22 PM GMT+02:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>As can be seen on the following testcase, instrument_mem_ref (for
>both -fsanitize=alignment and -fsanitize=null) has been using wrong
>type
>to find out what is the access type - instead of the type of MEM_REF
>which is the access type it was using the TREE_TYPE of MEM_REF's
>argument
>type, which can be some arbitrary other type, either due to type
>punning,
>or if it is a SSA_NAME it can be random other type because most pointer
>types are considered type compatible in GIMPLE.
>
>Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok
>for
>trunk?

OK.

Thanks,
Richard.

>2015-04-09  Jakub Jelinek  <jakub@redhat.com>
>
>	PR tree-optimization/65709
>	* ubsan.c (instrument_mem_ref): Use TREE_TYPE (base) instead of
>	TREE_TYPE (TREE_TYPE (t)).
>
>	* c-c++-common/ubsan/align-9.c: New test.
>
>--- gcc/ubsan.c.jj	2015-03-27 10:48:33.000000000 +0100
>+++ gcc/ubsan.c	2015-04-09 10:05:48.841221438 +0200
>@@ -1232,9 +1232,9 @@ instrument_mem_ref (tree mem, tree base,
>   tree t = TREE_OPERAND (base, 0);
>   if (!POINTER_TYPE_P (TREE_TYPE (t)))
>     return;
>-  if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_TYPE (t))) && mem !=
>base)
>+  if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (base)) && mem != base)
>     ikind = UBSAN_MEMBER_ACCESS;
>-  tree kind = build_int_cst (TREE_TYPE (t), ikind);
>+  tree kind = build_int_cst (build_pointer_type (TREE_TYPE (base)),
>ikind);
>   tree alignt = build_int_cst (pointer_sized_int_node, align);
>gcall *g = gimple_build_call_internal (IFN_UBSAN_NULL, 3, t, kind,
>alignt);
>   gimple_set_location (g, gimple_location (gsi_stmt (*iter)));
>--- gcc/testsuite/c-c++-common/ubsan/align-9.c.jj	2015-04-09
>10:11:15.227973011 +0200
>+++ gcc/testsuite/c-c++-common/ubsan/align-9.c	2015-04-09
>10:13:16.857017169 +0200
>@@ -0,0 +1,21 @@
>+/* Limit this to known non-strict alignment targets.  */
>+/* { dg-do run { target { i?86-*-linux* x86_64-*-linux* } } } */
>+/* { dg-options "-O2 -fsanitize=alignment
>-fsanitize-recover=alignment" } */
>+
>+__attribute__((noinline, noclone)) void
>+foo (void *p, const void *q)
>+{
>+  *(long int *) p = *(const long int *) q;
>+}
>+
>+int
>+main ()
>+{
>+  struct S { long c; char f[64]; char d; char e[2 * sizeof (long)];
>char g[64]; } s;
>+  __builtin_memset (&s, '\0', sizeof s);
>+  foo (&s.e[0], &s.e[sizeof (long)]);
>+  return 0;
>+}
>+
>+/* { dg-output "\.c:8:\[0-9]*: \[^\n\r]*load of misaligned address
>0x\[0-9a-fA-F]* for type 'const long int', which requires \[48] byte
>alignment.*" } */
>+/* { dg-output "\.c:8:\[0-9]*: \[^\n\r]*store to misaligned address
>0x\[0-9a-fA-F]* for type 'long int', which requires \[48] byte
>alignment" } */
>
>	Jakub


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-04-09 18:21 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-09 18:11 [PATCH] Fix ubsan type reporting (PR tree-optimization/65709) Jakub Jelinek
2015-04-09 18:21 ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).