early suggestion of -fcompound-names

This commit is contained in:
Lev Walkin 2017-09-05 03:43:00 -07:00
parent c17e14e66b
commit 5efafc56b4
7 changed files with 181 additions and 70 deletions

View File

@ -206,66 +206,84 @@ regen-makefile:
CPPFLAGS="" \
../sample.makefile.regen
check: ${TARGET} check-ber check-xer check-per
check: ${TARGET} check-ber check-xer check-oer check-per
@echo ================
@echo All tests passed
@echo ================
check-ber:
@if test -f sample-LDAPMessage-1.[db]er ; then \
for f in sample-LDAPMessage-*.[db]er; do \
for f in sample-*-*.[db]er; do \
pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z0-9-]+)-[0-9].*/\1/"`; \
for b in 1 17 33 980 8192; do \
echo "Recoding $$f into XER and back ($$b)..."; \
./${TARGET} -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
echo "Recoding $$f ($$pdu) into XER and back ($$b)..."; \
./${TARGET} -p $$pdu -b $$b -iber -oxer $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -p $$pdu -b $$b -ixer -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
diff ./.tmp.1.$$$$ ./.tmp.2.$$$$ || exit 4; \
rm -f ./.tmp.[12].$$$$; \
echo "Test junking $$f (please wait)..."; \
./${TARGET} -J0.0001 -n 1000 -b $$b -iber -onull $$f || exit 5; \
./${TARGET} -J0.001 -n 1000 -b $$b -iber -onull $$f || exit 6; \
./${TARGET} -J0.0001 -n 1000 -p $$pdu -b $$b -iber -onull $$f || exit 5; \
./${TARGET} -J0.001 -n 1000 -p $$pdu -b $$b -iber -onull $$f || exit 6; \
done; done; fi
check-xer:
@if test -f sample-LDAPMessage-1.xer ; then \
for f in sample-LDAPMessage-*.xer; do \
for f in sample-*-*.xer; do \
pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z0-9-]+)-[0-9].*/\1/"`; \
for b in 1 17 33 980 8192; do \
echo "Recoding $$f into DER and back ($$b)..."; \
./${TARGET} -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
echo "Recoding $$f ($$pdu) into DER and back ($$b)..."; \
./${TARGET} -p $$pdu -b $$b -ixer -oder $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -p $$pdu -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
diff $$f ./.tmp.2.$$$$ || exit 4; \
rm -f ./.tmp.[12].$$$$; \
echo "Test junking $$f (please wait)..."; \
./${TARGET} -J0.0001 -n 1000 -b $$b -ixer -onull $$f || exit 5; \
./${TARGET} -J0.001 -n 1000 -b $$b -ixer -onull $$f || exit 6; \
./${TARGET} -J0.0001 -n 1000 -p $$pdu -b $$b -ixer -onull $$f || exit 5; \
./${TARGET} -J0.001 -n 1000 -p $$pdu -b $$b -ixer -onull $$f || exit 6; \
done; done; fi
check-oer:
@if test -f sample-LDAPMessage-1.*oer ; then \
for f in sample-*-*.*oer; do \
pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z0-9-]+)-[0-9].*/\1/"`; \
for b in 1 17 33 980 8192; do \
echo "Recoding $$f ($$pdu) into XER and back ($$b)..."; \
./${TARGET} -p $$pdu -b $$b -ioer -oxer $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -p $$pdu -b $$b -ixer -ooer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
diff $$f ./.tmp.2.$$$$ || exit 4; \
rm -f ./.tmp.[12].$$$$; \
echo "Test junking $$f (please wait) ($$b) ..."; \
./${TARGET} -J0.0001 -n 1000 -p $$pdu -b $$b -ioer -onull $$f || exit 5; \
./${TARGET} -J0.001 -n 1000 -p $$pdu -b $$b -ioer -onull $$f || exit 6; \
done; done; fi
check-per:
@if test -f sample-LDAPMessage-1-nopad.per ; then \
for f in sample-LDAPMessage-[1-9]-nopad.per; do \
for f in sample-*-[1-9]-nopad.per; do \
pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z0-9-]+)-[0-9].*/\1/"`; \
for b in 1 17 33 980 8192; do \
echo "Recoding non-padded $$f into DER into XER and back ($$b)..."; \
./${TARGET} -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
./${TARGET} -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \
echo "Recoding non-padded $$f ($$pdu) into DER into XER and back ($$b)..."; \
./${TARGET} -p $$pdu -b $$b -per-nopad -iper -oder $$f > ./.tmp.1.$$$$ || exit 2; \
./${TARGET} -p $$pdu -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 3; \
./${TARGET} -p $$pdu -b $$b -ixer -oder ./.tmp.2.$$$$ > ./.tmp.3.$$$$ || exit 4; \
diff ./.tmp.1.$$$$ ./.tmp.3.$$$$ || exit 5; \
rm -f ./.tmp.[123].$$$$; \
echo "Test junking $$f (please wait)..."; \
./${TARGET} -J0.0001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 6; \
./${TARGET} -J0.001 -n 1000 -b $$b -per-nopad -iper -onull $$f || exit 7; \
./${TARGET} -J0.0001 -n 1000 -p $$pdu -b $$b -per-nopad -iper -onull $$f || exit 6; \
./${TARGET} -J0.001 -n 1000 -p $$pdu -b $$b -per-nopad -iper -onull $$f || exit 7; \
done; done; fi
@if test -f sample-LDAPMessage-1.per ; then \
for f in sample-*-[1-9].per; do \
pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \
pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z0-9-]+)-[0-9].*/\1/"`; \
for b in 1 17 33 980 8192; do \
echo "Recoding $$f into DER into XER and back ($$b)..."; \
./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \
./${TARGET} -b $$b -p $$pdu -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \
./${TARGET} -b $$b -p $$pdu -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \
echo "Recoding $$f ($$pdu) into DER into XER and back ($$b)..."; \
./${TARGET} -p $$pdu -b $$b -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \
./${TARGET} -p $$pdu -b $$b -iber -oxer ./.tmp.1.$$$$ > ./.tmp.2.$$$$ || exit 4; \
./${TARGET} -p $$pdu -b $$b -ixer -oper ./.tmp.2.$$$$ > ./.tmp.1.$$$$ || exit 5; \
diff $$f ./.tmp.1.$$$$ || exit 6; \
rm -f ./.tmp.[12].$$$$; \
echo "Test junking $$f (please wait)..."; \
./${TARGET} -J0.0001 -n 1000 -b $$b -iper -onull $$f || exit 7; \
./${TARGET} -J0.001 -n 1000 -b $$b -iper -onull $$f || exit 8; \
./${TARGET} -J0.0001 -n 1000 -p $$pdu -b $$b -iper -onull $$f || exit 7; \
./${TARGET} -J0.001 -n 1000 -p $$pdu -b $$b -iper -onull $$f || exit 8; \
done; done; fi
maybe-wip-pause:

View File

@ -4,6 +4,68 @@
#include "asn1c_misc.h"
#include <asn1_buffer.h>
struct intl_name {
asn1p_expr_t *expr;
asn1p_expr_t *clashes_with;
const char *name;
TQ_ENTRY(struct intl_name) next;
};
static TQ_HEAD(struct intl_name) used_names;
void
c_name_clash_finder_init() {
TQ_INIT(&used_names);
}
static void
register_global_name(arg_t *arg, const char *name) {
struct intl_name *n;
TQ_FOR(n, &used_names, next) {
if(strcmp(n->name, name) == 0) {
if(!(arg->expr->_mark & TM_NAMEGIVEN) && arg->expr != n->expr) {
n->clashes_with = arg->expr;
return;
}
}
}
n = calloc(1, sizeof(*n));
assert(n);
n->expr = arg->expr;
n->name = strdup(name);
TQ_ADD(&used_names, n, next);
}
int
c_name_clash(arg_t *arg) {
struct intl_name *n;
size_t n_clashes = 0;
const size_t max_clashes = 5;
TQ_FOR(n, &used_names, next) {
if(n->clashes_with) {
if(n_clashes++ > max_clashes) continue;
FATAL(
"Name \"%s\" is generated by %s.%s at line %s:%d and "
"%s.%s at line %s:%d",
n->name, n->expr->module->ModuleName, n->expr->Identifier,
n->expr->module->source_file_name, n->expr->_lineno,
n->clashes_with->module->ModuleName,
n->clashes_with->Identifier,
n->clashes_with->module->source_file_name,
n->clashes_with->_lineno);
}
}
if(n_clashes > max_clashes) {
FATAL("... %zu more name clashes not shown", n_clashes - max_clashes);
}
return n_clashes > 0;
}
static abuf *
construct_base_name(abuf *buf, arg_t *arg, int compound_names,
int avoid_keywords) {
@ -97,6 +159,16 @@ c_name_impl(arg_t *arg, int avoid_keywords) {
abuf_free(part_name);
abuf_free(member_name);
/* A _subset_ of names is checked against being globally unique */
register_global_name(arg, names.base_name);
register_global_name(arg, names.full_name);
register_global_name(arg, names.presence_enum);
register_global_name(arg, names.presence_name);
register_global_name(arg, names.members_enum);
register_global_name(arg, names.members_name);
arg->expr->_mark |= TM_NAMEGIVEN;
return names;
}
@ -133,5 +205,3 @@ c_presence_name(arg_t *arg, asn1p_expr_t *expr) {
return ab.buffer;
}

View File

@ -16,4 +16,13 @@ struct c_names c_name(arg_t *);
const char *c_member_name(arg_t *, asn1p_expr_t *); /* %s_%s */
const char *c_presence_name(arg_t *, asn1p_expr_t *); /* %s_PR_%s */
/*
* Returns 0 if no C name clashes have been encountered.
* Returns 1 if C name clashes have been encountered.
* Prints out the clashing items and suggests -fcompound-names.
*/
int c_name_clash(arg_t *arg);
void c_name_clash_finder_init(void);
#endif /* ASN1_COMPILER_NAMING_H */

View File

@ -3,6 +3,7 @@
#include "asn1c_out.h"
#include "asn1c_save.h"
#include "asn1c_ioc.h"
#include "asn1c_naming.h"
static void default_logger_cb(int, const char *fmt, ...);
static int asn1c_compile_expr(arg_t *arg, const asn1c_ioc_table_and_objset_t *);
@ -17,6 +18,8 @@ asn1_compile(asn1p_t *asn, const char *datadir, enum asn1c_flags flags,
asn1p_module_t *mod;
int ret;
c_name_clash_finder_init();
/*
* Initialize target language.
*/
@ -60,6 +63,20 @@ asn1_compile(asn1p_t *asn, const char *datadir, enum asn1c_flags flags,
}
}
if(c_name_clash(arg)) {
if(arg->flags & A1C_COMPOUND_NAMES) {
FATAL("Name clashes encountered even with -fcompound-names flag");
/* Proceed further for better debugging. */
} else {
FATAL("Use \"-fcompound-names\" flag to asn1c to resolve name clashes");
if(arg->flags & A1C_PRINT_COMPILED) {
/* Proceed further for better debugging. */
} else {
return -1;
}
}
}
DEBUG("Saving compiled data");
/*

View File

@ -250,7 +250,8 @@ typedef struct asn1p_expr_s {
TM_RECURSION = (1<<0), /* Used to break recursion */
TM_BROKEN = (1<<1), /* A warning was already issued */
TM_PERFROMCT = (1<<2), /* PER FROM() constraint tables emitted */
TM_NAMECLASH = (1<<3) /* Name clash found, need to add module name to resolve */
TM_NAMECLASH = (1<<3), /* Name clash found, need to add module name to resolve */
TM_NAMEGIVEN = (1<<4) /* The expression has already yielded a name */
} _mark;
/*

View File

@ -1,33 +1,33 @@
/*** <<< INCLUDES [Flag] >>> ***/
#include <INTEGER.h>
#include <NativeInteger.h>
#include <constr_SEQUENCE.h>
#include <ENUMERATED.h>
#include <NativeEnumerated.h>
/*** <<< DEPS [Flag] >>> ***/
typedef enum field {
field_red = 0,
field_green = 1,
field_blue = 5
} e_field;
typedef enum field {
field_red = 3,
field_green = 4,
field_blue = 5
} e_field;
typedef enum Flag_16P0__field {
Flag_16P0__field_red = 0,
Flag_16P0__field_green = 1,
Flag_16P0__field_blue = 5
} e_Flag_16P0__field;
typedef enum Flag_16P1__field {
Flag_16P1__field_red = 3,
Flag_16P1__field_green = 4,
Flag_16P1__field_blue = 5
} e_Flag_16P1__field;
/*** <<< TYPE-DECLS [Flag] >>> ***/
typedef struct Flag_16P0 {
INTEGER_t *field /* DEFAULT 5 */;
long *field /* DEFAULT 5 */;
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
} Flag_16P0_t;
typedef struct Flag_16P1 {
ENUMERATED_t *field /* DEFAULT 5 */;
long *field /* DEFAULT 5 */;
/* Context for parsing across buffer boundaries */
asn_struct_ctx_t _asn_ctx;
@ -46,14 +46,14 @@ extern asn_TYPE_member_t asn_MBR_Flag_16P1_6[1];
/*** <<< CODE [Flag] >>> ***/
/*
* This type is implemented using ENUMERATED,
* This type is implemented using NativeEnumerated,
* so here we adjust the DEF accordingly.
*/
/*** <<< STAT-DEFS [Flag] >>> ***/
static int asn_DFL_2_set_5(int set_value, void **sptr) {
INTEGER_t *st = *sptr;
long *st = *sptr;
if(!st) {
if(!set_value) return -1; /* Not a default value */
@ -63,20 +63,18 @@ static int asn_DFL_2_set_5(int set_value, void **sptr) {
if(set_value) {
/* Install default value 5 */
return asn_long2INTEGER(st, 5);
*st = 5;
return 0;
} else {
/* Test default value 5 */
long value;
if(asn_INTEGER2long(st, &value))
return -1;
return (value == 5);
return (*st == 5);
}
}
asn_TYPE_member_t asn_MBR_Flag_16P0_1[] = {
{ ATF_POINTER, 1, offsetof(struct Flag_16P0, field),
.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
.tag_mode = 0,
.type = &asn_DEF_INTEGER,
.type = &asn_DEF_NativeInteger,
.type_selector = 0,
.memb_constraints = 0, /* Defer constraints checking to the member type */
.oer_constraints = 0, /* OER is not compiled, use -gen-OER */
@ -119,7 +117,7 @@ asn_TYPE_descriptor_t asn_DEF_Flag_16P0 = {
};
static int asn_DFL_7_set_5(int set_value, void **sptr) {
ENUMERATED_t *st = *sptr;
long *st = *sptr;
if(!st) {
if(!set_value) return -1; /* Not a default value */
@ -129,13 +127,11 @@ static int asn_DFL_7_set_5(int set_value, void **sptr) {
if(set_value) {
/* Install default value 5 */
return asn_long2INTEGER(st, 5);
*st = 5;
return 0;
} else {
/* Test default value 5 */
long value;
if(asn_INTEGER2long(st, &value))
return -1;
return (value == 5);
return (*st == 5);
}
}
static const asn_INTEGER_enum_map_t asn_MAP_field_value2enum_7[] = {
@ -164,8 +160,8 @@ static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_field_7 = {
"field",
"field",
&asn_OP_ENUMERATED,
ENUMERATED_constraint,
&asn_OP_NativeEnumerated,
NativeEnumerated_constraint,
asn_DEF_field_tags_7,
sizeof(asn_DEF_field_tags_7)
/sizeof(asn_DEF_field_tags_7[0]), /* 1 */

View File

@ -105,7 +105,7 @@ typedef enum Type1_PR {
typedef struct Type1 {
Type1_PR present;
union Type1_u {
struct anonType {
struct Type1__anonType {
OCTET_STRING_t x;
OCTET_STRING_t y;
@ -182,7 +182,7 @@ memb_y_constraint_2(asn_TYPE_descriptor_t *td, const void *sptr,
/*** <<< STAT-DEFS [Type1] >>> ***/
static asn_TYPE_member_t asn_MBR_anonType_2[] = {
{ ATF_NOFLAGS, 0, offsetof(struct anonType, x),
{ ATF_NOFLAGS, 0, offsetof(struct Type1__anonType, x),
.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
.tag_mode = -1, /* IMPLICIT tag at current level */
.type = &asn_DEF_OCTET_STRING,
@ -193,7 +193,7 @@ static asn_TYPE_member_t asn_MBR_anonType_2[] = {
.default_value = 0,
.name = "x"
},
{ ATF_NOFLAGS, 0, offsetof(struct anonType, y),
{ ATF_NOFLAGS, 0, offsetof(struct Type1__anonType, y),
.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
.tag_mode = -1, /* IMPLICIT tag at current level */
.type = &asn_DEF_OCTET_STRING,
@ -214,8 +214,8 @@ static const asn_TYPE_tag2member_t asn_MAP_anonType_tag2el_2[] = {
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* y */
};
static asn_SEQUENCE_specifics_t asn_SPC_anonType_specs_2 = {
sizeof(struct anonType),
offsetof(struct anonType, _asn_ctx),
sizeof(struct Type1__anonType),
offsetof(struct Type1__anonType, _asn_ctx),
.tag2el = asn_MAP_anonType_tag2el_2,
.tag2el_count = 2, /* Count of tags in the map */
0, 0, 0, /* Optional elements (not needed) */
@ -302,7 +302,7 @@ typedef enum Type2_PR {
typedef struct Type2 {
Type2_PR present;
union Type2_u {
struct anonType {
struct Type2__anonType {
OCTET_STRING_t x;
OCTET_STRING_t y;
@ -379,7 +379,7 @@ memb_y_constraint_2(asn_TYPE_descriptor_t *td, const void *sptr,
/*** <<< STAT-DEFS [Type2] >>> ***/
static asn_TYPE_member_t asn_MBR_anonType_2[] = {
{ ATF_NOFLAGS, 0, offsetof(struct anonType, x),
{ ATF_NOFLAGS, 0, offsetof(struct Type2__anonType, x),
.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
.tag_mode = -1, /* IMPLICIT tag at current level */
.type = &asn_DEF_OCTET_STRING,
@ -390,7 +390,7 @@ static asn_TYPE_member_t asn_MBR_anonType_2[] = {
.default_value = 0,
.name = "x"
},
{ ATF_NOFLAGS, 0, offsetof(struct anonType, y),
{ ATF_NOFLAGS, 0, offsetof(struct Type2__anonType, y),
.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
.tag_mode = -1, /* IMPLICIT tag at current level */
.type = &asn_DEF_OCTET_STRING,
@ -411,8 +411,8 @@ static const asn_TYPE_tag2member_t asn_MAP_anonType_tag2el_2[] = {
{ (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* y */
};
static asn_SEQUENCE_specifics_t asn_SPC_anonType_specs_2 = {
sizeof(struct anonType),
offsetof(struct anonType, _asn_ctx),
sizeof(struct Type2__anonType),
offsetof(struct Type2__anonType, _asn_ctx),
.tag2el = asn_MAP_anonType_tag2el_2,
.tag2el_count = 2, /* Count of tags in the map */
0, 0, 0, /* Optional elements (not needed) */