Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/gcc.dg/analyzer/function-ptr-2.c @ 152:2b5abeee2509
update gcc11
author | anatofuz |
---|---|
date | Mon, 25 May 2020 07:50:57 +0900 |
parents | 1830386684a0 |
children |
line wrap: on
line source
#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.