--- /dev/null
+/* PR sanitizer/111736 */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-fsanitize=null,alignment -fdump-tree-optimized -ffat-lto-objects" } */
+/* { dg-final { scan-tree-dump-times "__ubsan_handle_type_mismatch" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-not "p_\[0-9]*.D. \[=!]= 0" "optimized" } } */
+
+#ifdef __x86_64__
+#define SEG __seg_fs
+#else
+#define SEG __seg_gs
+#endif
+
+int
+foo (int SEG *p, int *q)
+{
+ return *p;
+}
+
+__attribute__((no_sanitize("alignment"))) int
+bar (int SEG *p, int *q)
+{
+ return *p;
+}
}
}
check_null = sanitize_flags_p (SANITIZE_NULL);
+ if (check_null && POINTER_TYPE_P (TREE_TYPE (ptr)))
+ {
+ addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (ptr)));
+ if (!ADDR_SPACE_GENERIC_P (as)
+ && targetm.addr_space.zero_address_valid (as))
+ check_null = false;
+ }
if (check_align == NULL_TREE && !check_null)
{
if (align <= 1)
align = 0;
}
- if (align == 0 && !sanitize_flags_p (SANITIZE_NULL))
- return;
+ if (align == 0)
+ {
+ if (!sanitize_flags_p (SANITIZE_NULL))
+ return;
+ addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (base));
+ if (!ADDR_SPACE_GENERIC_P (as)
+ && targetm.addr_space.zero_address_valid (as))
+ return;
+ }
tree t = TREE_OPERAND (base, 0);
if (!POINTER_TYPE_P (TREE_TYPE (t)))
return;