remove undefined behavior
diff --git a/skeletons/NativeEnumerated_oer.c b/skeletons/NativeEnumerated_oer.c
index b1f67c2..8760005 100644
--- a/skeletons/NativeEnumerated_oer.c
+++ b/skeletons/NativeEnumerated_oer.c
@@ -9,6 +9,30 @@
 #include <NativeEnumerated.h>
 #include <errno.h>
 
+/*
+ * This function is only to get rid of Undefined Behavior Sanitizer warning.
+ */
+static intmax_t CLANG_NO_SANITIZE("shift-base")
+asn__safe_nativeenumerated_convert_helper(const uint8_t *b,
+                                          const uint8_t *end) {
+    intmax_t value;
+
+    /* Perform the sign initialization */
+    /* Actually value = -(*b >> 7); gains nothing, yet unreadable! */
+    if((*b >> 7)) {
+        value = -1;
+    } else {
+        value = 0;
+    }
+
+    /* Conversion engine */
+    for(; b < end; b++) {
+        value = (value << 8) | *b;
+    }
+
+    return value;
+}
+
 asn_dec_rval_t
 NativeEnumerated_decode_oer(const asn_codec_ctx_t *opt_codec_ctx,
                             asn_TYPE_descriptor_t *td,
@@ -42,7 +66,7 @@
          */
         size_t length = *b & 0x7f;
         const uint8_t *bend;
-        long value;
+        intmax_t value;
 
         if(length < 1 || length > sizeof(*native)) {
             ASN__DECODE_FAILED;
@@ -52,10 +76,8 @@
         }
         b++;
         bend = b + length;
-        value = (*b & 0x80) ? -1 : 0; /* Determine sign */
-        for(; b < bend; b++)
-            value = (value << 8) | *b;
 
+        value = asn__safe_nativeenumerated_convert_helper(b, bend);
         if(value < 0) {
             const asn_INTEGER_specifics_t *specs =
                 (const asn_INTEGER_specifics_t *)td->specifics;