asn1c编解码函数引发的段错误
Encode函数
uper_encode_to_new_buffer(&asn_DEF_MessageFrame, 0,msgFrame, (void**)&chbuf);
对于Encode函数,主要在于msgFrame编码后的地址空间会直接给到存放编码的buf,所以不需要对buf进行单独的申请以及释放,不然会报段错误,详细参见我之前的博客段错误(核心已转储)——那些易被忽略的细节
Decode函数
uper_decode(opt_codec_ctx, &asn_DEF_MessageFrame, (void**)&mf, decodeData, messageLength, 0, 0);
对于Decode函数需要注意以下几点:
1、decodeData不能是静态数组,单独测试解码一次时可以使用静态数组,但若想要进行多次解码,在第二次进行解码时,静态数组便出了问题,无法再访问其中的数据,目前猜测在decode函数中,对decodeData所在的堆栈进行了操作,系统无法自动回收,所以在下次访问静态数组时,会报段错误。
2、对于自己申请的MessageFrame_t* mf;在进行decode后,需要进行资源回收,这里可以用asn1c自带的API:ASN_FREE_STRUCT(asn_DEF_MessageFrame,mf);
,但是,仅仅释放了mf还不够,通过单步调试看到,即使free了mf,但是在下一次为mf申请空间后,mf所在地址空间内居然保留了上一次解码所产生的数值,这样的话,如果每次解码的消息体结构是一样的还好说,如果消息体结构不一致,也会报段错误,而且也会导致数据重复,最保险的做法是,在为mf申请空间后,将其地址空间内的值都置为0,即memset(mf, 0, sizeof(MessageFrame_t));当然了,其实不管在哪,自己申请了一块地址空间后,最保险还是将其内的数值重置为0。