Print this page
new smatch

*** 67,76 **** --- 67,94 ---- if (type != &char_ctype) return; set_terminated(array, &terminated); } + static struct smatch_state *get_terminated_state_var_sym(const char *name, struct symbol *sym) + { + struct sm_state *sm, *tmp; + + sm = get_sm_state(my_id, name, sym); + if (!sm) + return NULL; + if (sm->state == &terminated || sm->state == &unterminated) + return sm->state; + + FOR_EACH_PTR(sm->possible, tmp) { + if (tmp->state == &unterminated) + return &unterminated; + } END_FOR_EACH_PTR(tmp); + + return NULL; + } + static struct smatch_state *get_terminated_state(struct expression *expr) { struct sm_state *sm, *tmp; if (!expr)
*** 238,247 **** --- 256,272 ---- set_terminated_var_sym(name, sym, (*value == '1') ? &terminated : &unterminated); free: free_string(name); } + bool is_nul_terminated_var_sym(const char *name, struct symbol *sym) + { + if (get_terminated_state_var_sym(name, sym) == &terminated) + return 1; + return 0; + } + bool is_nul_terminated(struct expression *expr) { if (get_terminated_state(expr) == &terminated) return 1; return 0;