Hi! On the following (nonsensical) testcase we ICE because of pointer type mismatch. Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.8?
2013-08-13 Jakub Jelinek <ja...@redhat.com> PR sanitizer/56417 * asan.c (instrument_strlen_call): Fix typo in comment. Use char * type even for the lhs of POINTER_PLUS_EXPR. * gcc.dg/asan/pr56417.c: New test. --- gcc/asan.c.jj 2013-06-03 18:11:44.000000000 +0200 +++ gcc/asan.c 2013-07-22 22:28:11.467415676 +0200 @@ -1648,7 +1648,7 @@ instrument_mem_region_access (tree base, access to the last byte of the argument; it uses the result of the call to deduce the offset of that last byte. - Upon completion, iff the call has actullay been instrumented, this + Upon completion, iff the call has actually been instrumented, this function returns TRUE and *ITER points to the statement logically following the built-in strlen function call *ITER was initially pointing to. Otherwise, the function returns FALSE and *ITER @@ -1679,10 +1679,10 @@ instrument_strlen_call (gimple_stmt_iter /* Instrument the access to the first byte of str_arg. i.e: _1 = str_arg; instrument (_1); */ + tree cptr_type = build_pointer_type (char_type_node); gimple str_arg_ssa = gimple_build_assign_with_ops (NOP_EXPR, - make_ssa_name (build_pointer_type - (char_type_node), NULL), + make_ssa_name (cptr_type, NULL), str_arg, NULL); gimple_set_location (str_arg_ssa, loc); gimple_stmt_iterator gsi = *iter; @@ -1701,8 +1701,7 @@ instrument_strlen_call (gimple_stmt_iter pointer_plus expr: (_1 + len). */ gimple stmt = gimple_build_assign_with_ops (POINTER_PLUS_EXPR, - make_ssa_name (TREE_TYPE (str_arg), - NULL), + make_ssa_name (cptr_type, NULL), gimple_assign_lhs (str_arg_ssa), len); gimple_set_location (stmt, loc); --- gcc/testsuite/gcc.dg/asan/pr56417.c.jj 2013-07-22 22:34:39.376469948 +0200 +++ gcc/testsuite/gcc.dg/asan/pr56417.c 2013-07-22 21:36:39.000000000 +0200 @@ -0,0 +1,9 @@ +/* PR sanitizer/56417 */ +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +int +foo (void) +{ + return __builtin_strlen (&foo); +} Jakub