sanitizer: do not ICE for pointer cmp/sub
gcc/c/ChangeLog: PR sanitizer/98204 * c-typeck.c (pointer_diff): Do not emit a top-level sanitization. (build_binary_op): Likewise. gcc/testsuite/ChangeLog: PR sanitizer/98204 * c-c++-common/asan/pr98204.c: New test.
This commit is contained in:
parent
cf7efe2d36
commit
ab28eac607
@ -3949,10 +3949,9 @@ pointer_diff (location_t loc, tree op0, tree op1, tree *instrument_expr)
|
||||
pedwarn (loc, OPT_Wpointer_arith,
|
||||
"pointer to a function used in subtraction");
|
||||
|
||||
if (sanitize_flags_p (SANITIZE_POINTER_SUBTRACT))
|
||||
if (current_function_decl != NULL_TREE
|
||||
&& sanitize_flags_p (SANITIZE_POINTER_SUBTRACT))
|
||||
{
|
||||
gcc_assert (current_function_decl != NULL_TREE);
|
||||
|
||||
op0 = save_expr (op0);
|
||||
op1 = save_expr (op1);
|
||||
|
||||
@ -12324,6 +12323,7 @@ build_binary_op (location_t location, enum tree_code code,
|
||||
}
|
||||
|
||||
if ((code0 == POINTER_TYPE || code1 == POINTER_TYPE)
|
||||
&& current_function_decl != NULL_TREE
|
||||
&& sanitize_flags_p (SANITIZE_POINTER_COMPARE))
|
||||
{
|
||||
op0 = save_expr (op0);
|
||||
|
||||
6
gcc/testsuite/c-c++-common/asan/pr98204.c
Normal file
6
gcc/testsuite/c-c++-common/asan/pr98204.c
Normal file
@ -0,0 +1,6 @@
|
||||
/* PR sanitizer/98204 */
|
||||
/* { dg-options "-fsanitize=address,pointer-subtract,pointer-compare" } */
|
||||
|
||||
struct{int c;}v;
|
||||
static long i=((char*)&(v.c)-(char*)&v);
|
||||
static long i2=((char*)&(v.c)<(char*)&v);
|
||||
Loading…
Reference in New Issue
Block a user