From a28cbb9f66d703a4e9047ee2777bcf67a5b00e67 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Mon, 31 Jul 2017 20:20:17 -0700 Subject: [PATCH] add constraint debug --- libasn1compiler/asn1c_C.c | 12 +++++++----- libasn1compiler/asn1c_constraint.c | 6 +++--- libasn1compiler/asn1c_misc.c | 5 +++-- libasn1fix/asn1fix.c | 3 ++- libasn1fix/asn1fix_crange.c | 24 ++++++++++++++---------- libasn1fix/asn1fix_crange.h | 9 ++++++--- libasn1print/asn1print.c | 21 ++++++++++++--------- 7 files changed, 47 insertions(+), 33 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index 96c93942..40d1381d 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -2151,7 +2151,8 @@ emit_member_OER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { INDENT(+1); - range = asn1constraint_compute_OER_range(etype, expr->combined_constraints, + range = asn1constraint_compute_OER_range(expr->Identifier, etype, + expr->combined_constraints, ACT_EL_RANGE, 0, 0, 0); if(emit_single_member_OER_constraint(arg, range, 0)) { return -1; @@ -2160,7 +2161,8 @@ emit_member_OER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { OUT(",\n"); - range = asn1constraint_compute_OER_range(etype, expr->combined_constraints, + range = asn1constraint_compute_OER_range(expr->Identifier, etype, + expr->combined_constraints, ACT_CT_SIZE, 0, 0, 0); if(emit_single_member_OER_constraint(arg, range, "SIZE")) { return -1; @@ -2233,7 +2235,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { if(emit_single_member_PER_constraint(arg, &tmprng, 0, 0)) return -1; } else if(etype & ASN_STRING_KM_MASK) { - range = asn1constraint_compute_PER_range(etype, + range = asn1constraint_compute_PER_range(expr->Identifier, etype, expr->combined_constraints, ACT_CT_FROM, 0, 0, 0); DEBUG("Emitting FROM constraint for %s", expr->Identifier); @@ -2263,7 +2265,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { avoid: asn1constraint_range_free(range); } else { - range = asn1constraint_compute_PER_range(etype, + range = asn1constraint_compute_PER_range(expr->Identifier, etype, expr->combined_constraints, ACT_EL_RANGE, 0, 0, 0); if(emit_single_member_PER_constraint(arg, range, 0, 0)) @@ -2272,7 +2274,7 @@ emit_member_PER_constraints(arg_t *arg, asn1p_expr_t *expr, const char *pfx) { } OUT(",\n"); - range = asn1constraint_compute_PER_range(etype, + range = asn1constraint_compute_PER_range(expr->Identifier, etype, expr->combined_constraints, ACT_CT_SIZE, 0, 0, 0); if(emit_single_member_PER_constraint(arg, range, 0, "SIZE")) return -1; diff --git a/libasn1compiler/asn1c_constraint.c b/libasn1compiler/asn1c_constraint.c index df9ca68e..bf422680 100644 --- a/libasn1compiler/asn1c_constraint.c +++ b/libasn1compiler/asn1c_constraint.c @@ -43,8 +43,8 @@ asn1c_emit_constraint_checking_code(arg_t *arg) { etype = _find_terminal_type(arg); - r_value=asn1constraint_compute_PER_range(etype, ct, ACT_EL_RANGE,0,0,0); - r_size =asn1constraint_compute_PER_range(etype, ct, ACT_CT_SIZE, 0,0,0); + r_value=asn1constraint_compute_constraint_range(expr->Identifier, etype, ct, ACT_EL_RANGE,0,0,0); + r_size =asn1constraint_compute_constraint_range(expr->Identifier, etype, ct, ACT_CT_SIZE, 0,0,0); if(r_value) { if(r_value->incompatible || r_value->empty_constraint @@ -251,7 +251,7 @@ asn1c_emit_constraint_tables(arg_t *arg, int got_size) { etype = _find_terminal_type(arg); - range = asn1constraint_compute_PER_range(etype, ct, ACT_CT_FROM, 0,0,0); + range = asn1constraint_compute_constraint_range(arg->expr->Identifier, etype, ct, ACT_CT_FROM, 0,0,0); if(!range) return 0; if(range->incompatible diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 40be51b0..2bcc6999 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -359,7 +359,8 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { * applied (non-standard! but we can deal with this) to the type. * Check the range. */ - range = asn1constraint_compute_PER_range(expr->expr_type, + range = asn1constraint_compute_constraint_range(expr->Identifier, + expr->expr_type, expr->combined_constraints, ACT_CT_SIZE, 0, 0, CPR_simulate_fbless_SIZE); if(range) { @@ -375,7 +376,7 @@ asn1c_type_fits_long(arg_t *arg, asn1p_expr_t *expr) { /* * Third, pull up the PER visible range of the INTEGER. */ - range = asn1constraint_compute_PER_range(expr->expr_type, + range = asn1constraint_compute_PER_range(expr->Identifier, expr->expr_type, expr->combined_constraints, ACT_EL_RANGE, 0, 0, 0); if(!range diff --git a/libasn1fix/asn1fix.c b/libasn1fix/asn1fix.c index e6af2f24..124576f2 100644 --- a/libasn1fix/asn1fix.c +++ b/libasn1fix/asn1fix.c @@ -448,7 +448,8 @@ asn1f_check_constraints(arg_t *arg) { RET2RVAL(ret, rvalue); for(i = 0; i < sizeof(test_types)/sizeof(test_types[0]); i++) { - range = asn1constraint_compute_PER_range( + range = asn1constraint_compute_constraint_range( + arg->expr->Identifier, etype, arg->expr->combined_constraints, test_types[i], 0, 0, diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 907ffd6b..b38befe9 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -699,17 +699,21 @@ _range_canonicalize(asn1cnst_range_t *range) { } asn1cnst_range_t * -asn1constraint_compute_OER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { - return asn1constraint_compute_constraint_range(expr_type, ct, type, minmax, exmet, cpr_flags); +asn1constraint_compute_OER_range(const char *dbg_name, asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e requested_ct_type +, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { + return asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, requested_ct_type, minmax, exmet, cpr_flags | CPR_strict_OER_visibility); } asn1cnst_range_t * -asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { - return asn1constraint_compute_constraint_range(expr_type, ct, type, minmax, exmet, cpr_flags); +asn1constraint_compute_PER_range(const char *dbg_name, asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e requested_ct_type +, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { + if(0) return asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, requested_ct_type, minmax, exmet, cpr_flags | CPR_strict_PER_visibility); + /* Due to pecularities of PER constraint handling, we don't enable strict PER visibility upfront here. */ + return asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, requested_ct_type, minmax, exmet, cpr_flags); } asn1cnst_range_t * -asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { +asn1constraint_compute_constraint_range(const char *dbg_name, asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, const asn1cnst_range_t *minmax, int *exmet, enum cpr_flags cpr_flags) { asn1cnst_range_t *range; asn1cnst_range_t *tmp; asn1p_value_t *vmin; @@ -824,7 +828,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p return range; } assert(ct->el_count == 1); - tmp = asn1constraint_compute_constraint_range(expr_type, + tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct->elements[0], type, minmax, exmet, cpr_flags); if(tmp) { _range_free(range); @@ -843,7 +847,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p /* AND constraints, one after another. */ for(i = 0; i < ct->el_count; i++) { - tmp = asn1constraint_compute_constraint_range(expr_type, + tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct->elements[i], type, ct->type==ACT_CA_SET?range:minmax, exmet, cpr_flags); @@ -913,7 +917,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p */ tmp = 0; for(i = 0; i < ct->el_count; i++) { - tmp = asn1constraint_compute_constraint_range(expr_type, + tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct->elements[i], type, minmax, exmet, cpr_flags); if(!tmp) { @@ -946,7 +950,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p * Canonicalizator will do the union magic. */ for(; i < ct->el_count; i++) { - tmp = asn1constraint_compute_constraint_range(expr_type, + tmp = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct->elements[i], type, minmax, exmet, cpr_flags); if(!tmp) { @@ -1021,7 +1025,7 @@ asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, const asn1p */ assert(ct->el_count >= 1); _range_free(range); - range = asn1constraint_compute_constraint_range(expr_type, + range = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct->elements[0], type, minmax, exmet, cpr_flags); return range; default: diff --git a/libasn1fix/asn1fix_crange.h b/libasn1fix/asn1fix_crange.h index 5c2fad0a..a539508e 100644 --- a/libasn1fix/asn1fix_crange.h +++ b/libasn1fix/asn1fix_crange.h @@ -45,20 +45,23 @@ enum cpr_flags { CPR_strict_PER_visibility = 0x02, CPR_simulate_fbless_SIZE = 0x04, }; -asn1cnst_range_t *asn1constraint_compute_OER_range(asn1p_expr_type_e expr_type, +asn1cnst_range_t *asn1constraint_compute_OER_range(const char *dbg_name, + asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e required_type, const asn1cnst_range_t *minmax, int *expectation_met, enum cpr_flags); -asn1cnst_range_t *asn1constraint_compute_PER_range(asn1p_expr_type_e expr_type, +asn1cnst_range_t *asn1constraint_compute_PER_range(const char *dbg_name, + asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e required_type, const asn1cnst_range_t *minmax, int *expectation_met, enum cpr_flags); /* Base implementation */ -asn1cnst_range_t *asn1constraint_compute_constraint_range(asn1p_expr_type_e expr_type, +asn1cnst_range_t *asn1constraint_compute_constraint_range(const char *dbg_name, + asn1p_expr_type_e expr_type, const asn1p_constraint_t *ct, enum asn1p_constraint_type_e required_type, const asn1cnst_range_t *minmax, diff --git a/libasn1print/asn1print.c b/libasn1print/asn1print.c index f24545c0..9d0004f2 100644 --- a/libasn1print/asn1print.c +++ b/libasn1print/asn1print.c @@ -483,12 +483,12 @@ asn1print_crange_value(asn1cnst_edge_t *edge, int as_char) { } static int -asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, enum cpr_flags cpr) { +asn1print_constraint_explain_type(const char *dbg_name, asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum asn1p_constraint_type_e type, enum cpr_flags cpr) { asn1cnst_range_t *range; int as_char = (type==ACT_CT_FROM); int i; - range = asn1constraint_compute_constraint_range(expr_type, ct, type, 0, 0, cpr); + range = asn1constraint_compute_constraint_range(dbg_name, expr_type, ct, type, 0, 0, cpr); if(!range) return -1; if(range->incompatible) return 0; @@ -538,14 +538,14 @@ asn1print_constraint_explain_type(asn1p_expr_type_e expr_type, asn1p_constraint_ } static int -asn1print_constraint_explain(asn1p_expr_type_e expr_type, +asn1print_constraint_explain(const char *dbg_name, asn1p_expr_type_e expr_type, asn1p_constraint_t *ct, enum cpr_flags cpr) { - asn1print_constraint_explain_type(expr_type, ct, ACT_EL_RANGE, cpr); + asn1print_constraint_explain_type(dbg_name, expr_type, ct, ACT_EL_RANGE, cpr); safe_printf(" "); - asn1print_constraint_explain_type(expr_type, ct, ACT_CT_SIZE, cpr); + asn1print_constraint_explain_type(dbg_name, expr_type, ct, ACT_CT_SIZE, cpr); safe_printf(" "); - asn1print_constraint_explain_type(expr_type, ct, ACT_CT_FROM, cpr); + asn1print_constraint_explain_type(dbg_name, expr_type, ct, ACT_CT_FROM, cpr); return 0; } @@ -758,15 +758,18 @@ asn1print_expr(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *tc, enum asn1pri if(top_parent) { safe_printf("\n-- Practical constraints (%s): ", top_parent->Identifier); - asn1print_constraint_explain(top_parent->expr_type, + asn1print_constraint_explain(top_parent->Identifier, + top_parent->expr_type, tc->combined_constraints, 0); safe_printf("\n-- OER-visible constraints (%s): ", top_parent->Identifier); - asn1print_constraint_explain(top_parent->expr_type, + asn1print_constraint_explain(top_parent->Identifier, + top_parent->expr_type, tc->combined_constraints, CPR_strict_OER_visibility); safe_printf("\n-- PER-visible constraints (%s): ", top_parent->Identifier); - asn1print_constraint_explain(top_parent->expr_type, + asn1print_constraint_explain(top_parent->Identifier, + top_parent->expr_type, tc->combined_constraints, CPR_strict_PER_visibility); } safe_printf("\n");