/* PR tree-optimization/104715 - false dangling pointer with strstr Vertify that using pointers that have become dangling after they were passed to and returned from strstr is diagnosed. { dg-do compile } { dg-options "-Wall" } */ extern char* strstr (const char*, const char*); void sink (const void*); void nowarn_strstr_static (const char *s) { char *t1; { static const char a[] = "abc"; t1 = strstr (a, s); sink (t1); } sink (t1); } void nowarn_strstr_lit (const char *s) { char *t2; { t2 = strstr ("def", s); sink (t2); } sink (t2); } void warn_strstr_comp_lit (const char *s) { char *t3; { const char *a = (char[]){ '1', '\0' }; // { dg-message "unnamed temporary defined here" } t3 = strstr (a, s); sink (t3); } sink (t3); // { dg-warning "using dangling pointer 't3' to an unnamed temporary" } } void warn_strstr_arg (const char *s) { char *t4; { char a[] = "1"; // { dg-message "'a' declared here" } t4 = strstr (a, s); sink (t4); } sink (t4); // { dg-warning "using dangling pointer 't4' to 'a'" } } void warn_strstr_arg_plus_cst (const char *s) { char *t5; { char a[] = "12"; // { dg-message "'a' declared here" } t5 = strstr (a + 1, s); sink (t5); } sink (t5); // { dg-warning "using dangling pointer 't5' to 'a'" } } void warn_strstr_arg_plus_var (const char *s, int i) { char *t6; { char a[] = "123"; // { dg-message "'a' declared here" } t6 = strstr (a + i, s); sink (t6++); } sink (t6); // { dg-warning "using dangling pointer 't6' to 'a'" } }