Print this page
12257 resync smatch to 0.6.1-rc1-il-4

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/smatch_db.c
          +++ new/usr/src/tools/smatch/src/smatch_db.c
↓ open down ↓ 760 lines elided ↑ open up ↑
 761  761  
 762  762          /*
 763  763           * we just want to record something in the database so that if we have
 764  764           * two calls like:  frob(4); frob(some_unkown); then on the receiving
 765  765           * side we know that sometimes frob is called with unknown parameters.
 766  766           */
 767  767  
 768  768          sql_insert_caller_info(expr, INTERNAL, -1, "%call_marker%", type_to_str(type));
 769  769  }
 770  770  
 771      -static char *show_offset(int offset)
 772      -{
 773      -        static char buf[64];
 774      -
 775      -        buf[0] = '\0';
 776      -        if (offset != -1)
 777      -                snprintf(buf, sizeof(buf), "(-%d)", offset);
 778      -        return buf;
 779      -}
 780      -
 781  771  int is_recursive_member(const char *name)
 782  772  {
 783  773          char buf[256];
 784  774          const char *p, *next;
 785  775          int size;
 786  776  
 787  777          p = strchr(name, '>');
 788  778          if (!p)
 789  779                  return 0;
 790  780          p++;
↓ open down ↓ 62 lines elided ↑ open up ↑
 853  843                  snprintf(buf, sizeof(buf), "%s$->%s", add_star ? "*" : "",
 854  844                           sm_name + len);
 855  845          }
 856  846  
 857  847          ret = alloc_sname(buf);
 858  848  free:
 859  849          free_string(name);
 860  850          return ret;
 861  851  }
 862  852  
 863      -static void print_struct_members(struct expression *call, struct expression *expr, int param, int offset, struct stree *stree,
      853 +static void print_struct_members(struct expression *call, struct expression *expr, int param, struct stree *stree,
 864  854          void (*callback)(struct expression *call, int param, char *printed_name, struct sm_state *sm))
 865  855  {
 866  856          struct sm_state *sm;
 867  857          const char *sm_name;
 868  858          char *name;
 869  859          struct symbol *sym;
 870  860          int len;
 871  861          char printed_name[256];
 872  862          int is_address = 0;
 873  863          bool add_star;
↓ open down ↓ 21 lines elided ↑ open up ↑
 895  885                          continue;
 896  886                  sm_name = sm->name;
 897  887                  add_star = false;
 898  888                  if (sm_name[0] == '*') {
 899  889                          add_star = true;
 900  890                          sm_name++;
 901  891                  }
 902  892                  // FIXME: simplify?
 903  893                  if (!add_star && strcmp(name, sm_name) == 0) {
 904  894                          if (is_address)
 905      -                                snprintf(printed_name, sizeof(printed_name), "*$%s", show_offset(offset));
      895 +                                snprintf(printed_name, sizeof(printed_name), "*$");
 906  896                          else /* these are already handled. fixme: handle them here */
 907  897                                  continue;
 908  898                  } else if (add_star && strcmp(name, sm_name) == 0) {
 909      -                        snprintf(printed_name, sizeof(printed_name), "%s*$%s",
 910      -                                 is_address ? "*" : "", show_offset(offset));
      899 +                        snprintf(printed_name, sizeof(printed_name), "%s*$",
      900 +                                 is_address ? "*" : "");
 911  901                  } else if (strncmp(name, sm_name, len) == 0) {
 912  902                          if (sm_name[len] != '.' && sm_name[len] != '-')
 913  903                                  continue;
 914  904                          if (is_address)
 915  905                                  snprintf(printed_name, sizeof(printed_name),
 916      -                                         "%s$%s->%s", add_star ? "*" : "",
 917      -                                         show_offset(offset), sm_name + len + 1);
      906 +                                         "%s$->%s", add_star ? "*" : "",
      907 +                                         sm_name + len + 1);
 918  908                          else
 919  909                                  snprintf(printed_name, sizeof(printed_name),
 920      -                                         "%s$%s%s", add_star ? "*" : "",
 921      -                                         show_offset(offset), sm_name + len);
      910 +                                         "%s$%s", add_star ? "*" : "",
      911 +                                         sm_name + len);
 922  912                  } else {
 923  913                          continue;
 924  914                  }
 925  915                  if (is_recursive_member(printed_name))
 926  916                          continue;
 927  917                  callback(call, param, printed_name, sm);
 928  918          } END_FOR_EACH_SM(sm);
 929  919  free:
 930  920          free_string(name);
 931  921  }
 932  922  
 933      -static int param_used_callback(void *_container, int argc, char **argv, char **azColName)
 934      -{
 935      -        char **container = _container;
 936      -        static char buf[256];
 937      -
 938      -        snprintf(buf, sizeof(buf), "%s", argv[0]);
 939      -        *container = buf;
 940      -        return 0;
 941      -}
 942      -
 943      -static void print_container_struct_members(struct expression *call, struct expression *expr, int param, struct stree *stree,
 944      -        void (*callback)(struct expression *call, int param, char *printed_name, struct sm_state *sm))
 945      -{
 946      -        struct expression *tmp;
 947      -        char *container = NULL;
 948      -        int offset;
 949      -        int holder_offset;
 950      -        char *p;
 951      -
 952      -        if (!call->fn || call->fn->type != EXPR_SYMBOL || !call->fn->symbol)
 953      -                return;
 954      -
 955      -        /*
 956      -         * We can't use the in-mem DB because we have to parse the function
 957      -         * first, then we know if it takes a container, then we know to pass it
 958      -         * the container data.
 959      -         *
 960      -         */
 961      -        run_sql(&param_used_callback, &container,
 962      -                "select key from return_implies where %s and type = %d and key like '%%$(%%' and parameter = %d limit 1;",
 963      -                get_static_filter(call->fn->symbol), CONTAINER, param);
 964      -        if (!container)
 965      -                return;
 966      -
 967      -        p = strchr(container, '-');
 968      -        if (!p)
 969      -                return;
 970      -        offset = atoi(p);
 971      -        p = strchr(p, ')');
 972      -        if (!p)
 973      -                return;
 974      -        p++;
 975      -
 976      -        tmp = get_assigned_expr(expr);
 977      -        if (tmp)
 978      -                expr = tmp;
 979      -
 980      -        if (expr->type != EXPR_PREOP || expr->op != '&')
 981      -                return;
 982      -        expr = strip_expr(expr->unop);
 983      -        holder_offset = get_member_offset_from_deref(expr);
 984      -        if (-holder_offset != offset)
 985      -                return;
 986      -
 987      -        expr = strip_expr(expr->deref);
 988      -        if (expr->type == EXPR_PREOP && expr->op == '*')
 989      -                expr = strip_expr(expr->unop);
 990      -
 991      -        print_struct_members(call, expr, param, holder_offset, stree, callback);
 992      -}
 993      -
 994  923  static void match_call_info(struct expression *call)
 995  924  {
 996  925          struct member_info_callback *cb;
 997  926          struct expression *arg;
 998  927          struct stree *stree;
 999  928          char *name;
1000  929          int i;
1001  930  
1002  931          name = get_fnptr_name(call->fn);
1003  932          if (!name)
1004  933                  return;
1005  934  
1006  935          FOR_EACH_PTR(member_callbacks, cb) {
1007  936                  stree = get_all_states_stree(cb->owner);
1008  937                  i = 0;
1009  938                  FOR_EACH_PTR(call->args, arg) {
1010      -                        print_struct_members(call, arg, i, -1, stree, cb->callback);
1011      -                        print_container_struct_members(call, arg, i, stree, cb->callback);
      939 +                        print_struct_members(call, arg, i, stree, cb->callback);
1012  940                          i++;
1013  941                  } END_FOR_EACH_PTR(arg);
1014  942                  free_stree(&stree);
1015  943          } END_FOR_EACH_PTR(cb);
1016  944  
1017  945          free_string(name);
1018  946  }
1019  947  
1020  948  static int get_param(int param, char **name, struct symbol **sym)
1021  949  {
↓ open down ↓ 1728 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX