C语言,数组DataIn[]定义采坑

本文讲述了在C语言中定义uchar DataIn[16] = "1234567890123456";时可能会遇到的问题。由于字符串终止符的存在,实际上DataIn占用17字节,而定义的数组大小只有16字节,导致在作为函数参数时可能引发错误。作者通过一个错误实例展示了调用函数GETTIME1()时返回-10010(参数错误),并提醒开发者注意避免此类陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、数据空间(17)< 声明的空间16
uchar DataIn[16] = “1234567890123456”;
那么在调用函数时,DataIn作为入参的话,会出现一些不可预料的问题。

通常定义:
uchar DataIn[] = “1234567890123456”;
如上:定义的数据为:“1234567890123456” 16字节空间,加上停止位为17字节,不声明空间的话,会根据数据所占用的空间,进行默认分配。 此时系统默认分配17字节空间。从而保证函数调用其作为入参的时候,不会出现问题。

实例:

static void ExPedIdKeyCalc_PER1(void)  
{
	int ret;
	uchar State;
	uchar DataIn[] = "1234567890123456";
	uchar DataIn_Decrypt[256];
	int KeyIndex=1;
	int Mode=0;
	uchar DataOut[256];
	uchar EncKeyBlock[4096];
	int i=0,cnt=10;
	ulong time_ECB,time_CBC, TimeAvr_ECB,TimeAvr_CBC;
	ulong StartTime;

	memset(EncKeyBlock,0,sizeof(EncKeyBlock));
	memset(DataOut,0,sizeof(DataOut));

	ret = ExPedOpen();
	ASSERT(ret == RET_OK,"ExPedOpen ret = %d\n", ret);

	ret = ExPedEraseKeys();
	ASSERT(ret == RET_OK, "ExPedEraseKeys fail ret=%d", ret);

	ret = ExPedExportIdKey(KeyIndex, EncKeyBlock, Mode);
	ASSERT(ret == RET_OK,"ExPedExportIdKey ret = %d\n", ret);

	ret = OsRSA(Modulus,ModulusLen,Exp,ExpLen,EncKeyBlock,DataOut);
	ASSERT(ret == RET_OK,"OsRSA ret = %d\n", ret);

	ret = ExPedWriteKey_SM4_TDK(KeyIndex,DataOut);
	ASSERT(ret == RET_OK,"ExPedWriteKey_SM4_TDK ret = %d\n", ret);

	 TimeAvr_ECB = TimeAvr_CBC= 0;
	 time_ECB = time_CBC = 0;
	for(i=0;i<cnt;i++)
	{
		memset(DataOut,0,sizeof(DataOut));
		GETTIME1(time_ECB, ret = ExPedIdKeyCalc(KeyIndex, NULL, DataIn, strlen(DataIn), DataOut, PED_SM4_ECB_ENCRYPT));
		TimeAvr_ECB += time_ECB;
		ASSERT(ret == RET_OK,"ExPedIdKeyCalc ret = %d\n", ret);

		memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
		ret = ExPedSM4(KeyIndex,NULL,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_ECB_DECRYPT);
		ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);
		ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");


		uchar Initvector[16] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56,
				0x78, 0x90, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF	};

		memset(DataOut,0,sizeof(DataOut));
		GETTIME1(time_CBC, ret = ExPedIdKeyCalc(KeyIndex, Initvector, DataIn, strlen(DataIn), DataOut, PED_SM4_CBC_ENCRYPT));
		TimeAvr_CBC += time_CBC;
		ASSERT(ret == RET_OK,"ExPedIdKeyCalc  ret = %d\n", ret);

		memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
		ret = ExPedSM4(KeyIndex,Initvector,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_CBC_DECRYPT);
		ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);

		ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");
	}

	LOG("EBC=%d,CBC=%d",TimeAvr_ECB/cnt,TimeAvr_CBC/cnt);

	ExPedClose();
}

错误实例:

static void ExPedIdKeyCalc_PER1(void)  
{
	int ret;
	uchar State;
	uchar DataIn[16] = "1234567890123456";
	uchar DataIn_Decrypt[256];
	int KeyIndex=1;
	int Mode=0;
	uchar DataOut[256];
	uchar EncKeyBlock[4096];
	int i=0,cnt=10;
	ulong time_ECB,time_CBC, TimeAvr_ECB,TimeAvr_CBC;
	ulong StartTime;

	memset(EncKeyBlock,0,sizeof(EncKeyBlock));
	memset(DataOut,0,sizeof(DataOut));

	ret = ExPedOpen();
	ASSERT(ret == RET_OK,"ExPedOpen ret = %d\n", ret);

	ret = ExPedEraseKeys();
	ASSERT(ret == RET_OK, "ExPedEraseKeys fail ret=%d", ret);

	ret = ExPedExportIdKey(KeyIndex, EncKeyBlock, Mode);
	ASSERT(ret == RET_OK,"ExPedExportIdKey ret = %d\n", ret);

	ret = OsRSA(Modulus,ModulusLen,Exp,ExpLen,EncKeyBlock,DataOut);
	ASSERT(ret == RET_OK,"OsRSA ret = %d\n", ret);

	ret = ExPedWriteKey_SM4_TDK(KeyIndex,DataOut);
	ASSERT(ret == RET_OK,"ExPedWriteKey_SM4_TDK ret = %d\n", ret);

	 TimeAvr_ECB = TimeAvr_CBC= 0;
	 time_ECB = time_CBC = 0;
	for(i=0;i<cnt;i++)
	{
		memset(DataOut,0,sizeof(DataOut));
		GETTIME1(time_ECB, ret = ExPedIdKeyCalc(KeyIndex, NULL, DataIn, strlen(DataIn), DataOut, PED_SM4_ECB_ENCRYPT));
		TimeAvr_ECB += time_ECB;
		ASSERT(ret == RET_OK,"ExPedIdKeyCalc ret = %d\n", ret);

		memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
		ret = ExPedSM4(KeyIndex,NULL,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_ECB_DECRYPT);
		ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);
		ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");


		uchar Initvector[16] = {0x12, 0x34, 0x56, 0x78, 0x90, 0x12, 0x34, 0x56,
				0x78, 0x90, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF	};

		memset(DataOut,0,sizeof(DataOut));
		GETTIME1(time_CBC, ret = ExPedIdKeyCalc(KeyIndex, Initvector, DataIn, strlen(DataIn), DataOut, PED_SM4_CBC_ENCRYPT));
		TimeAvr_CBC += time_CBC;
		ASSERT(ret == RET_OK,"ExPedIdKeyCalc  ret = %d\n", ret);

		memset(DataIn_Decrypt,0,sizeof(DataIn_Decrypt));
		ret = ExPedSM4(KeyIndex,Initvector,DataOut,sizeof(DataOut),DataIn_Decrypt,PED_SM4_CBC_DECRYPT);
		ASSERT(ret == RET_OK,"ExPedSM4 ret = %d\n", ret);

		ASSERT(memcmp(DataIn,DataIn_Decrypt,strlen(DataIn))==0,"DataIn !=DataIn_Decrypt \n");
	}

	LOG("EBC=%d,CBC=%d",TimeAvr_ECB/cnt,TimeAvr_CBC/cnt);

	ExPedClose();
}

其中声明定义:uchar DataIn[16] = “1234567890123456”;
//但是后面实际占用的字节空间为17字节

这会导致在 调用GETTIME1(time_CBC, ret = ExPedIdKeyCalc(KeyIndex, Initvector, DataIn, strlen(DataIn), DataOut, PED_SM4_CBC_ENCRYPT));函数时,报错,ret 返回-10010(参数错误)。

作为一个测试人员,在这个问题上踩过2次坑了,每次排查问题,都花费好长时间,所以分享给大家,避免采坑啊!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值