about summary refs log tree commit diff homepage
path: root/test/Feature/FunctionPointer.c
blob: e1ae1e376c9b3f74a6f231bbf0007982aef01586 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// RUN: %llvmgcc %s -emit-llvm -g -c -o %t1.bc
// RUN: %klee --no-output --exit-on-error %t1.bc

#include <stdio.h>

void foo(const char *msg) { printf("foo: %s\n", msg); }
void baz(const char *msg) { printf("baz: %s\n", msg); }

void (*xx)(const char *) = foo;

void bar(void (*fp)(const char *)) { fp("called via bar"); }

int main(int argc, char **argv) {
  void (*fp)(const char *) = foo;

  printf("going to call through fp\n");
  fp("called via fp");

  printf("calling via pass through\n");
  bar(foo);
        
  fp = baz;
  fp("called via fp");

  xx("called via xx");

#if 0
  klee_make_symbolic(&fp, sizeof fp);
  if(fp == baz) {
    printf("fp = %p, baz = %p\n", fp, baz);
    fp("calling via symbolic!");
  }
#endif

  return 0;
}