diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/analyzer/function-ptr-2.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/analyzer/function-ptr-2.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/analyzer/function-ptr-2.c b/gcc/testsuite/gcc.dg/analyzer/function-ptr-2.c new file mode 100644 index 0000000..411b1b3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/function-ptr-2.c @@ -0,0 +1,44 @@ +#include <stdlib.h> +#include "analyzer-decls.h" + +typedef void (*fn_ptr_t) (void *); + +void +calls_free (void *victim) +{ + free (victim); +} + +void +no_op (void *ptr) +{ +} + +void test_1 (void *ptr) +{ + fn_ptr_t fn_ptr = calls_free; + __analyzer_eval (fn_ptr == calls_free); /* { dg-warning "TRUE" } */ + __analyzer_eval (fn_ptr != NULL); /* { dg-warning "TRUE" } */ + __analyzer_eval (fn_ptr == NULL); /* { dg-warning "FALSE" } */ + __analyzer_eval (fn_ptr == no_op); /* { dg-warning "FALSE" } */ + + fn_ptr (ptr); + fn_ptr (ptr); +} +// TODO: issue a double-'free' warning at 2nd call to fn_ptr. + +/* As above, but with an extra indirection to try to thwart + the optimizer. */ + +void test_2 (void *ptr, fn_ptr_t *fn_ptr) +{ + *fn_ptr = calls_free; + __analyzer_eval (*fn_ptr == calls_free); /* { dg-warning "TRUE" } */ + __analyzer_eval (*fn_ptr != NULL); /* { dg-warning "TRUE" } */ + __analyzer_eval (*fn_ptr == NULL); /* { dg-warning "FALSE" } */ + __analyzer_eval (*fn_ptr == no_op); /* { dg-warning "FALSE" } */ + + (*fn_ptr) (ptr); + (*fn_ptr) (ptr); +} +// TODO: issue a double-'free' warning at 2nd call to fn_ptr. |