现象描述
算法源码出现的报错,具体如下
相关定义部分
#define VARS4UPDATE \
__m128i k[2], state[S_NUM], stateNew[S_NUM], M[M_NUM];
#define INIT_STATE(key, iv) \
k[0] = load(key + 16 * 0); \
k[1] = load(key + 16 * 1); \
state[0] = k[1]; \
state[1] = load(iv); \
state[2] = load(Z0); \
state[3] = load(Z1); \
state[4] = xor(state[1], state[0]); \
state[5] = setzero(); \
state[6] = k[0]; \
state[7] = setzero(); \
M[0] = state[2]; \
M[1] = state[3]; \
for (size_t i = 0; i < INIT_LOOP; ++i ) { \
UPDATE_STATE(M) \
} \
state[0] = xor(state[0], k[0]); \
state[4] = xor(state[4], k[1]);
#define COPY_FROM_LOCAL_IN_INIT(ctx) \
COPY_FROM_LOCAL (ctx) for (size_t i = 0; i < 2; ++i) \
{ store(&(ctx -> key[i][0]), k[i]); }
报错函数部分
void rocca_init(rocca_context* ctx, const uint8_t* key, \
const uint8_t* iv) {
VARS4UPDATE
INIT_STATE(key, iv); // 报错:应输入表达式
COPY_FROM_LOCAL_IN_INIT(ctx); // 报错:不允许使用类型名
ctx->size_ad = 0;
ctx->size_m = 0;
}
初步分析
第一次遇到使用多行定义的情况,查了一下找到两种可能原因。
- 定义语句末尾加了分号导致的,于是将多行定义最后一行末尾的分号去掉,结果同原报错;
- 是看到使用多行定义的大多使用
{...}
或do{...} while(0)
将定义内容括起来,尝试后结果同原报错。
怀疑过可能是 _m128i
的问题,查阅 Microsoft Learn,只说明了“ARM 处理器不支持 __m128i
数据类型”。
运行环境
- Visual Studio 2019
- Windows 10
- Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz
- x64