blob: fd25e3be40bebd6c2ec8e85286353d4038e402d0 [file] [log] [blame]
#include <stdlib.h>
#include "analyzer-decls.h"
typedef void (*fn_ptr_t) (void *);
void
calls_free (void *victim)
{
free (victim); /* { dg-warning "double-'free' of '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);
}
/* 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);
}