I defined a uint8 type: Uint8 ::= INTEGER (0..255) and got:
flag Uint8_XER_Decode_aux(Uint8* pVal, const char* xmlTag, ByteStream* pByteStrm, int* pErrCode)
{
flag ret = TRUE;
(void)pVal;
(void)xmlTag;
(void)pByteStrm;
(void)pErrCode;
ret = Xer_DecodePosInteger(pByteStrm, xmlTag, pVal, pErrCode);
ret = true;
*pErrCode = ret ? 0 : ERR_XER_DECODE_UINT8;
return ret;
}
This generated code assigns an asn1SccUint to the address of a uint8.
This causes a warning (breaking the automated test cases) and causes Uint8_XER_Decode_aux to write past the end of the uint8. When on the stack, this unexpectedly modifies the variable below it on the stack!
foo.c: In function ‘Uint8_XER_Decode_aux’:
foo.c:460:48: warning: passing argument 3 of ‘Xer_DecodePosInteger’ from incompatible pointer type [-Wincompatible-pointer-types]
ret = Xer_DecodePosInteger(pByteStrm, xmlTag, pVal, pErrCode);
^~~~
A more correct solution is to follow the approach of BitStream_DecodeConstraintPosWholeNumberUInt8: use an asn1SccSint stack variable to temporarily hold the result before casting to the smaller type.
flag Uint8_XER_Decode_aux(Uint8* pVal, const char* xmlTag, ByteStream* pByteStrm, int* pErrCode)
{
flag ret = TRUE;
asn1SccSint val;
(void)pVal;
(void)xmlTag;
(void)pByteStrm;
(void)pErrCode;
ret = Xer_DecodeInteger(pByteStrm, xmlTag, &val, pErrCode);
*pVal = (Uint8)val;
*pErrCode = ret ? 0 : ERR_XER_DECODE_SINT8;
return ret;
}
When using
-slim
with XML, decoding is broken.I defined a uint8 type:
Uint8 ::= INTEGER (0..255)
and got:This generated code assigns an
asn1SccUint
to the address of a uint8.This causes a warning (breaking the automated test cases) and causes
Uint8_XER_Decode_aux
to write past the end of theuint8
. When on the stack, this unexpectedly modifies the variable below it on the stack!A more correct solution is to follow the approach of
BitStream_DecodeConstraintPosWholeNumberUInt8
: use anasn1SccSint
stack variable to temporarily hold the result before casting to the smaller type.This would fix both the warning and the bug.