Print this page
12166 resync smatch to 0.6.1-rc1-il-3
*** 21,30 ****
--- 21,31 ----
# define SMATCH_H_
#include <stdio.h>
#include <string.h>
#include <limits.h>
+ #include <float.h>
#include <sys/time.h>
#include <sqlite3.h>
#include "lib.h"
#include "allocate.h"
#include "scope.h"
*** 35,44 ****
--- 36,48 ----
typedef struct {
struct symbol *type;
union {
long long value;
unsigned long long uvalue;
+ float fvalue;
+ double dvalue;
+ long double ldvalue;
};
} sval_t;
typedef long long mtag_t;
*** 204,213 ****
--- 208,218 ----
int get_lineno(void);
extern int final_pass;
extern struct symbol *cur_func_sym;
extern int option_debug;
extern int local_debug;
+ extern int debug_db;
bool debug_implied(void);
extern int option_info;
extern int option_spammy;
extern int option_timeout;
extern char *trace_variable;
*** 238,248 ****
* sm_info(): info message (from option_info)
* sm_debug(): debug message
* sm_msg(): other message (please avoid using this)
*/
! #define sm_printf(msg...) do { if (final_pass || option_debug || local_debug) fprintf(sm_outfd, msg); } while (0)
static inline void sm_prefix(void)
{
sm_printf("%s: %s:%d %s() ", progname, get_filename(), get_lineno(), get_function());
}
--- 243,256 ----
* sm_info(): info message (from option_info)
* sm_debug(): debug message
* sm_msg(): other message (please avoid using this)
*/
! #define sm_printf(msg...) do { \
! if (final_pass || option_debug || local_debug || debug_db) \
! fprintf(sm_outfd, msg); \
! } while (0)
static inline void sm_prefix(void)
{
sm_printf("%s: %s:%d %s() ", progname, get_filename(), get_lineno(), get_function());
}
*** 252,262 ****
extern bool __silence_warnings_for_stmt;
#define sm_print_msg(type, msg...) \
do { \
print_implied_debug_msg(); \
! if (!final_pass && !option_debug && !local_debug) \
break; \
if (__silence_warnings_for_stmt && !option_debug && !local_debug) \
break; \
if (!option_info && is_silenced_function()) \
break; \
--- 260,270 ----
extern bool __silence_warnings_for_stmt;
#define sm_print_msg(type, msg...) \
do { \
print_implied_debug_msg(); \
! if (!final_pass && !option_debug && !local_debug && !debug_db) \
break; \
if (__silence_warnings_for_stmt && !option_debug && !local_debug) \
break; \
if (!option_info && is_silenced_function()) \
break; \
*** 275,290 ****
sm_printf("\n"); \
} while (0)
#define sm_msg(msg...) do { sm_print_msg(0, msg); } while (0)
- #define local_debug(msg...) \
- do { \
- if (local_debug) \
- sm_msg(msg); \
- } while (0)
-
extern char *implied_debug_msg;
static inline void print_implied_debug_msg(void)
{
static struct symbol *last_printed = NULL;
--- 283,292 ----
*** 295,304 ****
--- 297,307 ----
last_printed = cur_func_sym;
sm_msg("%s", implied_debug_msg);
}
#define sm_debug(msg...) do { if (option_debug) sm_printf(msg); } while (0)
+ #define db_debug(msg...) do { if (option_debug || debug_db) sm_printf(msg); } while (0)
#define sm_info(msg...) do { \
if (option_debug || (option_info && final_pass)) { \
sm_prefix(); \
sm_printf("info: "); \
*** 436,445 ****
--- 439,449 ----
struct statement *get_current_statement(void);
struct statement *get_prev_statement(void);
struct expression *get_last_expr_from_expression_stmt(struct expression *expr);
int get_param_num_from_sym(struct symbol *sym);
int get_param_num(struct expression *expr);
+ struct symbol *get_param_sym_from_num(int num);
int ms_since(struct timeval *start);
int parent_is_gone_var_sym(const char *name, struct symbol *sym);
int parent_is_gone(struct expression *expr);
int invert_op(int op);
int op_remove_assign(int op);
*** 804,815 ****
BUF_SIZE = 1002,
CAPPED_DATA = 1004,
RETURN_VALUE = 1005,
DEREFERENCE = 1006,
RANGE_CAP = 1007,
- LOCK_HELD = 1008,
- LOCK_RELEASED = 1009,
ABSOLUTE_LIMITS = 1010,
PARAM_ADD = 1012,
PARAM_FREED = 1013,
DATA_SOURCE = 1014,
FUZZY_MAX = 1015,
--- 808,817 ----
*** 843,852 ****
--- 845,858 ----
USER_DATA_SET = 9017,
NO_OVERFLOW = 8018,
NO_OVERFLOW_SIMPLE = 8019,
LOCKED = 8020,
UNLOCKED = 8021,
+ HALF_LOCKED = 9022,
+ LOCK_RESTORED = 9023,
+ KNOWN_LOCKED = 9024,
+ KNOWN_UNLOCKED = 9025,
SET_FS = 8022,
ATOMIC_INC = 8023,
ATOMIC_DEC = 8024,
NO_SIDE_EFFECT = 8025,
FN_ARG_LINK = 8028,
*** 885,894 ****
--- 891,901 ----
const char *get_param_name_var_sym(const char *name, struct symbol *sym);
const char *get_param_name(struct sm_state *sm);
const char *get_mtag_name_var_sym(const char *state_name, struct symbol *sym);
const char *get_mtag_name_expr(struct expression *expr);
char *get_data_info_name(struct expression *expr);
+ char *sm_to_arg_name(struct expression *expr, struct sm_state *sm);
int is_recursive_member(const char *param_name);
char *escape_newlines(const char *str);
void sql_exec(struct sqlite3 *db, int (*callback)(void*, int, char**, char**), void *data, const char *sql);
*** 895,905 ****
#define sql_helper(db, call_back, data, sql...) \
do { \
char sql_txt[1024]; \
\
sqlite3_snprintf(sizeof(sql_txt), sql_txt, sql); \
! sm_debug("debug: %s\n", sql_txt); \
sql_exec(db, call_back, data, sql_txt); \
} while (0)
#define run_sql(call_back, data, sql...) \
--- 902,912 ----
#define sql_helper(db, call_back, data, sql...) \
do { \
char sql_txt[1024]; \
\
sqlite3_snprintf(sizeof(sql_txt), sql_txt, sql); \
! db_debug("debug: %s\n", sql_txt); \
sql_exec(db, call_back, data, sql_txt); \
} while (0)
#define run_sql(call_back, data, sql...) \
*** 929,939 ****
p += snprintf(p, buf + sizeof(buf) - p, \
"insert %sinto %s values (", \
ignore ? "or ignore " : "", #table); \
p += snprintf(p, buf + sizeof(buf) - p, values); \
p += snprintf(p, buf + sizeof(buf) - p, ");"); \
! sm_debug("mem-db: %s\n", buf); \
rc = sqlite3_exec(_db, buf, NULL, NULL, &err); \
if (rc != SQLITE_OK) { \
sm_ierror("SQL error #2: %s", err); \
sm_ierror("SQL: '%s'", buf); \
parse_error = 1; \
--- 936,946 ----
p += snprintf(p, buf + sizeof(buf) - p, \
"insert %sinto %s values (", \
ignore ? "or ignore " : "", #table); \
p += snprintf(p, buf + sizeof(buf) - p, values); \
p += snprintf(p, buf + sizeof(buf) - p, ");"); \
! db_debug("mem-db: %s\n", buf); \
rc = sqlite3_exec(_db, buf, NULL, NULL, &err); \
if (rc != SQLITE_OK) { \
sm_ierror("SQL error #2: %s", err); \
sm_ierror("SQL: '%s'", buf); \
parse_error = 1; \
*** 1005,1015 ****
extern char *option_project_str;
extern char *bin_dir;
extern char *data_dir;
extern int option_no_data;
extern int option_full_path;
- extern int option_param_mapper;
extern int option_call_tree;
extern int num_checks;
enum project_type {
PROJ_NONE,
--- 1012,1021 ----
*** 1060,1069 ****
--- 1066,1076 ----
/* smatch_return_to_param.c */
void __add_return_to_param_mapping(struct expression *assign, const char *return_string);
char *map_call_to_param_name_sym(struct expression *expr, struct symbol **sym);
/* smatch_comparison.c */
+ extern int comparison_id;
#define UNKNOWN_COMPARISON 0
#define IMPOSSIBLE_COMPARISON -1
struct compare_data {
/* The ->left and ->right expression pointers might be NULL (I'm lazy) */
struct expression *left;
*** 1115,1126 ****
--- 1122,1136 ----
/* smatch_sval.c */
sval_t *sval_alloc(sval_t sval);
sval_t *sval_alloc_permanent(sval_t sval);
sval_t sval_blank(struct expression *expr);
sval_t sval_type_val(struct symbol *type, long long val);
+ sval_t sval_type_fval(struct symbol *type, long double fval);
sval_t sval_from_val(struct expression *expr, long long val);
+ sval_t sval_from_fval(struct expression *expr, long double fval);
int sval_is_ptr(sval_t sval);
+ bool sval_is_fp(sval_t sval);
int sval_unsigned(sval_t sval);
int sval_signed(sval_t sval);
int sval_bits(sval_t sval);
int sval_bits_used(sval_t sval);
int sval_is_negative(sval_t sval);
*** 1169,1178 ****
--- 1179,1192 ----
struct smatch_state *get_stored_condition(struct expression *expr);
struct expression_list *get_conditions(struct expression *expr);
struct sm_state *stored_condition_implication_hook(struct expression *expr,
struct state_list **true_stack,
struct state_list **false_stack);
+ /* smatch_parsed_conditions.c */
+ struct sm_state *parsed_condition_implication_hook(struct expression *expr,
+ struct state_list **true_stack,
+ struct state_list **false_stack);
/* check_string_len.c */
int get_formatted_string_size(struct expression *call, int arg);
int get_formatted_string_min_size(struct expression *call, int arg);
*** 1270,1279 ****
--- 1284,1301 ----
(type->type == SYM_PTR ||
type->type == SYM_ARRAY ||
type->type == SYM_FN);
}
+ static inline bool type_is_fp(struct symbol *type)
+ {
+ return type &&
+ (type == &float_ctype ||
+ type == &double_ctype ||
+ type == &ldouble_ctype);
+ }
+
static inline int type_bits(struct symbol *type)
{
if (!type)
return 0;
if (type_is_ptr(type))
*** 1311,1324 ****
--- 1333,1389 ----
}
/*
* Returns -1 if one is smaller, 0 if they are the same and 1 if two is larger.
*/
+
+ static inline int fp_cmp(sval_t one, sval_t two)
+ {
+ struct symbol *type;
+
+ if (sval_is_fp(one) && sval_is_fp(two))
+ type = type_bits(one.type) > type_bits(two.type) ? one.type : two.type;
+ else if (sval_is_fp(one))
+ type = one.type;
+ else
+ type = two.type;
+
+ one = sval_cast(type, one);
+ two = sval_cast(type, two);
+
+ if (one.type == &float_ctype) {
+ if (one.fvalue < two.fvalue)
+ return -1;
+ if (one.fvalue == two.fvalue)
+ return 0;
+ return 1;
+ }
+ if (one.type == &double_ctype) {
+ if (one.dvalue < two.dvalue)
+ return -1;
+ if (one.dvalue == two.dvalue)
+ return 0;
+ return 1;
+ }
+ if (one.type == &ldouble_ctype) {
+ if (one.ldvalue < two.ldvalue)
+ return -1;
+ if (one.ldvalue == two.ldvalue)
+ return 0;
+ return 1;
+ }
+ sm_perror("bad type in fp_cmp(): %s", type_to_str(type));
+ return 1;
+ }
+
static inline int sval_cmp(sval_t one, sval_t two)
{
struct symbol *type;
+ if (sval_is_fp(one) || sval_is_fp(two))
+ return fp_cmp(one, two);
+
type = one.type;
if (sval_positive_bits(two) > sval_positive_bits(one))
type = two.type;
if (type_bits(type) < 31)
type = &int_ctype;