Commit 0995f351 authored by Lev Walkin's avatar Lev Walkin

get rid of undefined behavior

parent beedbdeb
...@@ -80,7 +80,6 @@ OBJECT_IDENTIFIER_constraint(asn_TYPE_descriptor_t *td, const void *sptr, ...@@ -80,7 +80,6 @@ OBJECT_IDENTIFIER_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
return 0; return 0;
} }
int int
OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) { OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, signed int add, void *rvbufp, unsigned int rvsize) {
unsigned LE GCC_NOTUSED = 1; /* Little endian (x86) */ unsigned LE GCC_NOTUSED = 1; /* Little endian (x86) */
...@@ -93,6 +92,8 @@ OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, sig ...@@ -93,6 +92,8 @@ OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, sig
rvsize *= CHAR_BIT; /* bytes to bits */ rvsize *= CHAR_BIT; /* bytes to bits */
arclen *= 7; /* bytes to bits */ arclen *= 7; /* bytes to bits */
assert(add <= 0);
/* /*
* The arc has the number of bits * The arc has the number of bits
* cannot be represented using supplied return value type. * cannot be represented using supplied return value type.
...@@ -133,11 +134,13 @@ OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, sig ...@@ -133,11 +134,13 @@ OBJECT_IDENTIFIER_get_single_arc(const uint8_t *arcbuf, unsigned int arclen, sig
/* Gather all bits into the accumulator */ /* Gather all bits into the accumulator */
for(accum = cache; arcbuf < arcend; arcbuf++) for(accum = cache; arcbuf < arcend; arcbuf++)
accum = (accum << 7) | (*arcbuf & ~0x80); accum = (accum << 7) | (*arcbuf & ~0x80);
if(accum < (unsigned)-add) { if(accum < (unsigned)-add
|| accum > (ULONG_MAX-(unsigned long)(-add))) {
errno = ERANGE; /* Overflow */ errno = ERANGE; /* Overflow */
return -1; return -1;
} }
*(unsigned long *)(void *)rvbuf = accum + add; /* alignment OK! */ *(unsigned long *)(void *)rvbuf =
accum - (unsigned long)(-add); /* alignment OK! */
return 0; return 0;
} }
......
...@@ -13,14 +13,14 @@ _print(const void *buffer, size_t size, void *app_key) { ...@@ -13,14 +13,14 @@ _print(const void *buffer, size_t size, void *app_key) {
} }
static void static void
check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { check_OID(int lineno, uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
OBJECT_IDENTIFIER_t *oid; OBJECT_IDENTIFIER_t *oid;
asn_dec_rval_t rval; asn_dec_rval_t rval;
unsigned long arcs[10]; unsigned long arcs[10];
int alen; int alen;
int i; int i;
printf("Checking {"); printf("%03d: Checking {", lineno);
for(i = 0; i < (int)len; i++) { printf("%s%02x", i?" ":"", buf[i]); } for(i = 0; i < (int)len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
printf("} against {"); printf("} against {");
for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); } for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
...@@ -60,14 +60,14 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { ...@@ -60,14 +60,14 @@ check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
} }
static void static void
check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { check_ROID(int lineno, uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
RELATIVE_OID_t *oid; RELATIVE_OID_t *oid;
asn_dec_rval_t rval; asn_dec_rval_t rval;
unsigned long arcs[10]; unsigned long arcs[10];
int alen; int alen;
int i; int i;
printf("Checking {"); printf("%03d: Checking {", lineno);
for(i = 0; i < (ssize_t)len; i++) { printf("%s%02x", i?" ":"", buf[i]); } for(i = 0; i < (ssize_t)len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
printf("} against {"); printf("} against {");
for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); } for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
...@@ -107,7 +107,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) { ...@@ -107,7 +107,7 @@ check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
* Encode the specified array of arcs as RELATIVE-OID, decode it and compare. * Encode the specified array of arcs as RELATIVE-OID, decode it and compare.
*/ */
static void static void
check_REGEN(int *arcs, int acount) { check_REGEN(int lineno, int *arcs, int acount) {
static RELATIVE_OID_t oid; static RELATIVE_OID_t oid;
unsigned long tmp_arcs[10]; unsigned long tmp_arcs[10];
int tmp_alen = 10; int tmp_alen = 10;
...@@ -116,7 +116,7 @@ check_REGEN(int *arcs, int acount) { ...@@ -116,7 +116,7 @@ check_REGEN(int *arcs, int acount) {
int i; int i;
if(0) { if(0) {
fprintf(stderr, "Encoding (R) {"); fprintf(stderr, "%03d: Encoding (R) {", lineno);
for(i = 0; i < acount; i++) { for(i = 0; i < acount; i++) {
fprintf(stderr, " %u", arcs[i]); fprintf(stderr, " %u", arcs[i]);
} }
...@@ -149,7 +149,7 @@ check_REGEN(int *arcs, int acount) { ...@@ -149,7 +149,7 @@ check_REGEN(int *arcs, int acount) {
* decode it and compare. * decode it and compare.
*/ */
static void static void
check_REGEN_OID(int *arcs, int acount) { check_REGEN_OID(int lineno, int *arcs, int acount) {
static OBJECT_IDENTIFIER_t oid; static OBJECT_IDENTIFIER_t oid;
unsigned long tmp_arcs[10]; unsigned long tmp_arcs[10];
int tmp_alen = 10; int tmp_alen = 10;
...@@ -158,7 +158,7 @@ check_REGEN_OID(int *arcs, int acount) { ...@@ -158,7 +158,7 @@ check_REGEN_OID(int *arcs, int acount) {
int i; int i;
if(0) { if(0) {
fprintf(stderr, "Encoding (O) {"); fprintf(stderr, "%03d: Encoding (O) {", lineno);
for(i = 0; i < acount; i++) { for(i = 0; i < acount; i++) {
fprintf(stderr, " %u", arcs[i]); fprintf(stderr, " %u", arcs[i]);
} }
...@@ -274,16 +274,18 @@ static void check_xer(int expect_arcs, char *xer) { ...@@ -274,16 +274,18 @@ static void check_xer(int expect_arcs, char *xer) {
assert(ret == expect_arcs); assert(ret == expect_arcs);
} }
#define CHECK_OID(n) check_OID(buf ## n, sizeof(buf ## n), \ #define CHECK_OID(n) \
buf ## n ## _check, \ check_OID(__LINE__, buf##n, sizeof(buf##n), buf##n##_check, \
sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) sizeof(buf##n##_check) / sizeof(buf##n##_check[0]))
#define CHECK_ROID(n) check_ROID(buf ## n, sizeof(buf ## n), \ #define CHECK_ROID(n) \
buf ## n ## _check, \ check_ROID(__LINE__, buf##n, sizeof(buf##n), buf##n##_check, \
sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) sizeof(buf##n##_check) / sizeof(buf##n##_check[0]))
#define CHECK_REGEN(n) check_REGEN(buf ## n ## _check, \ #define CHECK_REGEN(n) \
sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) check_REGEN(__LINE__, buf##n##_check, \
#define CHECK_REGEN_OID(n) check_REGEN_OID(buf ## n ## _check, \ sizeof(buf##n##_check) / sizeof(buf##n##_check[0]))
sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0])) #define CHECK_REGEN_OID(n) \
check_REGEN_OID(__LINE__, buf##n##_check, \
sizeof(buf##n##_check) / sizeof(buf##n##_check[0]))
int int
main() { main() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment