PR target/96260 - KASAN should work even back-end not porting anything.
- Most KASAN function don't need any porting anything in back-end except asan stack protection. - However kernel will given shadow offset when enable asan stack protection, so eveything in KASAN can work if shadow offset is given. - Verified with x86 and risc-v. - Verified with RISC-V linux kernel. gcc/ChangeLog: PR target/96260 * asan.c (asan_shadow_offset_set_p): New. * asan.h (asan_shadow_offset_set_p): Ditto. * toplev.c (process_options): Allow -fsanitize=kernel-address even TARGET_ASAN_SHADOW_OFFSET not implemented, only check when asan stack protection is enabled. gcc/testsuite/ChangeLog: PR target/96260 * gcc.target/riscv/pr91441.c: Update warning message. * gcc.target/riscv/pr96260.c: New.
This commit is contained in:
parent
5029d42c40
commit
2ca1b6d009
5 changed files with 40 additions and 2 deletions
|
@ -344,6 +344,13 @@ asan_shadow_offset ()
|
|||
return asan_shadow_offset_value;
|
||||
}
|
||||
|
||||
/* Returns Asan shadow offset has been set. */
|
||||
bool
|
||||
asan_shadow_offset_set_p ()
|
||||
{
|
||||
return asan_shadow_offset_computed;
|
||||
}
|
||||
|
||||
alias_set_type asan_shadow_set = -1;
|
||||
|
||||
/* Pointer types to 1, 2 or 4 byte integers in shadow memory. A separate
|
||||
|
|
|
@ -129,6 +129,8 @@ asan_var_and_redzone_size (unsigned HOST_WIDE_INT size)
|
|||
|
||||
extern bool set_asan_shadow_offset (const char *);
|
||||
|
||||
extern bool asan_shadow_offset_set_p ();
|
||||
|
||||
extern void set_sanitized_sections (const char *);
|
||||
|
||||
extern bool asan_sanitize_stack_p (void);
|
||||
|
|
|
@ -7,4 +7,4 @@ int *f( int a)
|
|||
{
|
||||
return bar(&a);
|
||||
}
|
||||
/* { dg-warning ".'-fsanitize=address' and '-fsanitize=kernel-address' are not supported for this target" "" { target *-*-* } 0 } */
|
||||
/* { dg-warning ".'-fsanitize=kernel-address' with stack protection is not supported without '-fasan-shadow-offset=' for this target" "" { target *-*-* } 0 } */
|
||||
|
|
9
gcc/testsuite/gcc.target/riscv/pr96260.c
Normal file
9
gcc/testsuite/gcc.target/riscv/pr96260.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* PR target/96260 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "--param asan-stack=1 -fsanitize=kernel-address -fasan-shadow-offset=0x100000" } */
|
||||
|
||||
int *bar(int *);
|
||||
int *f( int a)
|
||||
{
|
||||
return bar(&a);
|
||||
}
|
22
gcc/toplev.c
22
gcc/toplev.c
|
@ -1835,7 +1835,7 @@ process_options (void)
|
|||
/* Address Sanitizer needs porting to each target architecture. */
|
||||
|
||||
if ((flag_sanitize & SANITIZE_ADDRESS)
|
||||
&& (!FRAME_GROWS_DOWNWARD || targetm.asan_shadow_offset == NULL))
|
||||
&& !FRAME_GROWS_DOWNWARD)
|
||||
{
|
||||
warning_at (UNKNOWN_LOCATION, 0,
|
||||
"%<-fsanitize=address%> and %<-fsanitize=kernel-address%> "
|
||||
|
@ -1843,6 +1843,26 @@ process_options (void)
|
|||
flag_sanitize &= ~SANITIZE_ADDRESS;
|
||||
}
|
||||
|
||||
if ((flag_sanitize & SANITIZE_USER_ADDRESS)
|
||||
&& targetm.asan_shadow_offset == NULL)
|
||||
{
|
||||
warning_at (UNKNOWN_LOCATION, 0,
|
||||
"%<-fsanitize=address%> not supported for this target");
|
||||
flag_sanitize &= ~SANITIZE_ADDRESS;
|
||||
}
|
||||
|
||||
if ((flag_sanitize & SANITIZE_KERNEL_ADDRESS)
|
||||
&& (targetm.asan_shadow_offset == NULL
|
||||
&& param_asan_stack
|
||||
&& !asan_shadow_offset_set_p ()))
|
||||
{
|
||||
warning_at (UNKNOWN_LOCATION, 0,
|
||||
"%<-fsanitize=kernel-address%> with stack protection "
|
||||
"is not supported without %<-fasan-shadow-offset=%> "
|
||||
"for this target");
|
||||
flag_sanitize &= ~SANITIZE_ADDRESS;
|
||||
}
|
||||
|
||||
/* Do not use IPA optimizations for register allocation if profiler is active
|
||||
or patchable function entries are inserted for run-time instrumentation
|
||||
or port does not emit prologue and epilogue as RTL. */
|
||||
|
|
Loading…
Add table
Reference in a new issue