get rid of undefined behavior
diff --git a/skeletons/OBJECT_IDENTIFIER.c b/skeletons/OBJECT_IDENTIFIER.c
index ffca36e..b2c97ae 100644
--- a/skeletons/OBJECT_IDENTIFIER.c
+++ b/skeletons/OBJECT_IDENTIFIER.c
@@ -80,7 +80,6 @@
 	return 0;
 }
 
-
 int
 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) */
@@ -93,6 +92,8 @@
 	rvsize *= CHAR_BIT;	/* bytes to bits */
 	arclen *= 7;		/* bytes to bits */
 
+	assert(add <= 0);
+
 	/*
 	 * The arc has the number of bits
 	 * cannot be represented using supplied return value type.
@@ -133,11 +134,13 @@
 		/* Gather all bits into the accumulator */
 		for(accum = cache; arcbuf < arcend; arcbuf++)
 			accum = (accum << 7) | (*arcbuf & ~0x80);
-		if(accum < (unsigned)-add) {
+		if(accum < (unsigned)-add
+		|| accum > (ULONG_MAX-(unsigned long)(-add))) {
 			errno = ERANGE;	/* Overflow */
 			return -1;
 		}
-		*(unsigned long *)(void *)rvbuf = accum + add;	/* alignment OK! */
+		*(unsigned long *)(void *)rvbuf =
+			accum - (unsigned long)(-add); /* alignment OK! */
 		return 0;
 	}
 
diff --git a/tests/tests-skeletons/check-OIDs.c b/tests/tests-skeletons/check-OIDs.c
index 92c27d5..dac2193 100644
--- a/tests/tests-skeletons/check-OIDs.c
+++ b/tests/tests-skeletons/check-OIDs.c
@@ -13,14 +13,14 @@
 }
 
 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;
 	asn_dec_rval_t rval;
 	unsigned long arcs[10];
 	int alen;
 	int i;
 
-	printf("Checking {");
+	printf("%03d: Checking {", lineno);
 	for(i = 0; i < (int)len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
 	printf("} against {");
 	for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
@@ -60,14 +60,14 @@
 }
 
 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;
 	asn_dec_rval_t rval;
 	unsigned long arcs[10];
 	int alen;
 	int i;
 
-	printf("Checking {");
+	printf("%03d: Checking {", lineno);
 	for(i = 0; i < (ssize_t)len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
 	printf("} against {");
 	for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
@@ -107,7 +107,7 @@
  * Encode the specified array of arcs as RELATIVE-OID, decode it and compare.
  */
 static void
-check_REGEN(int *arcs, int acount) {
+check_REGEN(int lineno, int *arcs, int acount) {
 	static RELATIVE_OID_t oid;
 	unsigned long tmp_arcs[10];
 	int tmp_alen = 10;
@@ -116,7 +116,7 @@
 	int i;
 
 	if(0) {
-		fprintf(stderr, "Encoding (R) {");
+		fprintf(stderr, "%03d: Encoding (R) {", lineno);
 		for(i = 0; i < acount; i++) {
 			fprintf(stderr, " %u", arcs[i]);
 		}
@@ -149,7 +149,7 @@
  * decode it and compare.
  */
 static void
-check_REGEN_OID(int *arcs, int acount) {
+check_REGEN_OID(int lineno, int *arcs, int acount) {
 	static OBJECT_IDENTIFIER_t oid;
 	unsigned long tmp_arcs[10];
 	int tmp_alen = 10;
@@ -158,7 +158,7 @@
 	int i;
 
 	if(0) {
-		fprintf(stderr, "Encoding (O) {");
+		fprintf(stderr, "%03d: Encoding (O) {", lineno);
 		for(i = 0; i < acount; i++) {
 			fprintf(stderr, " %u", arcs[i]);
 		}
@@ -274,16 +274,18 @@
 	assert(ret == expect_arcs);
 }
 
-#define	CHECK_OID(n)	check_OID(buf ## n, sizeof(buf ## n),		\
-		buf ## n ## _check,					\
-		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
-#define	CHECK_ROID(n)	check_ROID(buf ## n, sizeof(buf ## n),		\
-		buf ## n ## _check,					\
-		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
-#define	CHECK_REGEN(n) check_REGEN(buf ## n ## _check,			\
-		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
-#define	CHECK_REGEN_OID(n) check_REGEN_OID(buf ## n ## _check,		\
-		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
+#define CHECK_OID(n)                                            \
+    check_OID(__LINE__, buf##n, sizeof(buf##n), buf##n##_check, \
+              sizeof(buf##n##_check) / sizeof(buf##n##_check[0]))
+#define CHECK_ROID(n)                                            \
+    check_ROID(__LINE__, buf##n, sizeof(buf##n), buf##n##_check, \
+               sizeof(buf##n##_check) / sizeof(buf##n##_check[0]))
+#define CHECK_REGEN(n)                    \
+    check_REGEN(__LINE__, buf##n##_check, \
+                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
 main() {