Print this page
11972 resync smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/validation/backend/function-ptr.c
          +++ new/usr/src/tools/smatch/src/validation/backend/function-ptr.c
   1      -typedef int (*fn_t)(int x, int y);
        1 +extern int ival;
        2 +extern int *ipval;
        3 +extern int array[3];
        4 +extern int matrix[3][3];
        5 +extern int fun(int);
   2    6  
   3      -static int run(fn_t fn, int x, int y)
        7 +// via an argument
        8 +void arg(int a, int *p, int (*fb)(unsigned char), int (*fi)(int), int (*fl)(long), int (*fv)(void), int (*fip)(int *), int (*fim)(int (*)[3]), int (*fvp)(void *), int (*ffp)(int (*)(int)));
        9 +void arg(int a, int *p, int (*fb)(unsigned char), int (*fi)(int), int (*fl)(long), int (*fv)(void), int (*fip)(int *), int (*fim)(int (*)[3]), int (*fvp)(void *), int (*ffp)(int (*)(int)))
   4   10  {
   5      -        return fn(x, y);
       11 +        fv();
       12 +
       13 +        fb(a);
       14 +        fi(a);
       15 +        fl(a);
       16 +        fb(123);
       17 +        fi(123);
       18 +        fl(123);
       19 +        fb(123L);
       20 +        fi(123L);
       21 +        fl(123L);
       22 +        fb(ival);
       23 +        fi(ival);
       24 +        fl(ival);
       25 +
       26 +        fip(p);
       27 +        fip((void*)0);
       28 +        fip(ipval);
       29 +        fip(&ival);
       30 +        fip(array);
       31 +        fim(matrix);
       32 +
       33 +        fvp(p);
       34 +        fvp((void*)0);
       35 +        fvp(ipval);
       36 +        fvp(&ival);
       37 +        fvp(array);
       38 +        fvp(matrix);
       39 +
       40 +        fvp(fun);
       41 +        fvp(&fun);
       42 +        ffp(fun);
       43 +        ffp(&fun);
   6   44  }
   7   45  
       46 +// a global
       47 +extern int (*fb)(unsigned char);
       48 +extern int (*fi)(int);
       49 +extern int (*fl)(long);
       50 +extern int (*fv)(void);
       51 +extern int (*fip)(int *);
       52 +extern int (*fim)(int (*)[3]);
       53 +extern int (*fvp)(void *);
       54 +extern int (*ffp)(int (*)(int));
       55 +
       56 +void glb(int a, int *p);
       57 +void glb(int a, int *p)
       58 +{
       59 +        fv();
       60 +
       61 +        fb(a);
       62 +        fi(a);
       63 +        fl(a);
       64 +        fb(123);
       65 +        fi(123);
       66 +        fl(123);
       67 +        fb(123L);
       68 +        fi(123L);
       69 +        fl(123L);
       70 +        fb(ival);
       71 +        fi(ival);
       72 +        fl(ival);
       73 +
       74 +        fip(p);
       75 +        fip((void*)0);
       76 +        fip(ipval);
       77 +        fip(&ival);
       78 +        fip(array);
       79 +        fim(matrix);
       80 +
       81 +        fvp(p);
       82 +        fvp((void*)0);
       83 +        fvp(ipval);
       84 +        fvp(&ival);
       85 +        fvp(array);
       86 +        fvp(matrix);
       87 +
       88 +        fvp(fun);
       89 +        fvp(&fun);
       90 +        ffp(fun);
       91 +        ffp(&fun);
       92 +}
       93 +
       94 +// via a struct member:
       95 +// -> force to create a register containing the function pointer
       96 +struct ops {
       97 +        int (*fb)(unsigned char);
       98 +        int (*fi)(int);
       99 +        int (*fl)(long);
      100 +        int (*fv)(void);
      101 +        int (*fip)(int *);
      102 +        int (*fim)(int (*)[3]);
      103 +        int (*fvp)(void *);
      104 +        int (*ffp)(int (*)(int));
      105 +
      106 +        int (*const cfi)(int);          // for the fun of it
      107 +};
      108 +
      109 +void ops(int a, int *p, struct ops *ops);
      110 +void ops(int a, int *p, struct ops *ops)
      111 +{
      112 +        ops->fv();
      113 +
      114 +        ops->fb(a);
      115 +        ops->fi(a);
      116 +        ops->fl(a);
      117 +        ops->fb(123);
      118 +        ops->fi(123);
      119 +        ops->fl(123);
      120 +        ops->fb(123L);
      121 +        ops->fi(123L);
      122 +        ops->fl(123L);
      123 +        ops->fb(ival);
      124 +        ops->fi(ival);
      125 +        ops->fl(ival);
      126 +
      127 +        ops->fip(p);
      128 +        ops->fip((void*)0);
      129 +        ops->fip(ipval);
      130 +        ops->fip(&ival);
      131 +        ops->fip(array);
      132 +        ops->fim(matrix);
      133 +
      134 +        ops->fvp(p);
      135 +        ops->fvp((void*)0);
      136 +        ops->fvp(ipval);
      137 +        ops->fvp(&ival);
      138 +        ops->fvp(array);
      139 +        ops->fvp(matrix);
      140 +
      141 +        ops->fvp(fun);
      142 +        ops->fvp(&fun);
      143 +        ops->ffp(fun);
      144 +        ops->ffp(&fun);
      145 +        ops->fvp(fi);
      146 +
      147 +        ops->cfi(42);
      148 +}
      149 +
   8  150  /*
   9  151   * check-name: Function pointer code generation
  10  152   * check-command: sparsec -c $file -o tmp.o
  11  153   */
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX