我有一个库函数,其签名如下:
sgx_status_t sgx_unseal_data(
const sgx_sealed_data_t * p_sealed_data,
uint8_t * p_additional_MACtext,
uint32_t * p_additional_MACtext_length,
uint8_t * p_decrypted_text,
uint32_t * p_decrypted_text_length
);
现在,对于uint32_t * p_decrypted_text_length。
案例1:通过
char resecret[50];
uint32_t resecret_len = sizeof(resecret);
status = sgx_unseal_data(
(sgx_sealed_data_t*)sealed_data,
NULL,
NULL,
(uint8_t*)&resecret,
(uint32_t*)&resecret_len); //Notice last parameter
案例2:失败
char resecret[50];
// uint32_t resecret_len = sizeof(resecret);
status = sgx_unseal_data(
(sgx_sealed_data_t*)sealed_data,
NULL,
NULL,
(uint8_t*)&resecret,
(uint32_t*)&(sizeof(resecret))); //Notice last parameter
我的问题是第二种情况失败的原因。我在铸造中缺少什么?另外,如果你能解释一下uint_8t,uint_32t,size_t和它们的指针堂兄弟之间的投射。
答案 0 :(得分:3)
可能发生的是sgx_unseal_data
函数模拟通过引用传递。
您将指针传递给变量,因此该函数可以取消引用指针以进行赋值。
sizeof
返回的值是编译时值,即所谓的rvalue。首先,你无法获得这些值的地址,就像试图获取整数文字的地址一样(例如&12
这是无意义的)。其次,即使获得rvalue的地址是有效的,对该位置的赋值也没有价值,因为你没有变量存储它。
这个问题根本与你的投射无关,只是你无法获得右值的地址。