注意:-这个问题与Passing C++ struct to enclave from app in Intel SGX非常相似。由于该职位将近1年,我将再次发布它,希望可能会有解决方案。如果您认为此重复项,请删除它。
我正在开发英特尔SGX应用程序。我不受信任的应用程序中有一个类(称为 SkipList ),其中包含一个结构(称为 node ) 。我试图将此结构作为具有[[user_check] ]属性的 * void ****传递给飞地。
struct node {
size_t key;
T2 value;
vector<size_t> hashlabel;
vector<node*> forward;
};
一旦我在飞地内部收到了此消息,便将其转换为如下所示的struct类型。
SkipList<int,string>::node* head = static_cast<SkipList<int,string>::node*>(Node);
当我开始调试它时,我看到强制转换后的“ head”地址正确(我也在应用程序侧检查了该地址,两个地址都相同),并且“ forward”成员的地址也正确。但是,当我尝试查看“转发”的元素时,只能看到1个元素。实际上应该有15个以上的元素。
有人可以告诉我这是SGX STL矢量实现的问题吗?为什么我不能按预期看到它?
答案 0 :(得分:0)
我能够解决该问题。
问题是我的节点结构。如果看到结构的第二个成员,则它是模板参数。我在运行时将其设置为 string 类型。但是字符串的大小在编译时并不固定。由于编译器不知道字符串的大小,因此无法正确进行类型转换
gen ddtt=clock("21/11/12 01:20 PM", "MDYhm")
因此解决方案是将成员值移动到结构的末尾:)。
现在,我取得了进一步的进步,陷入了另一个问题。问题是字符串的std :: hash计算在安全区内外是不同的。我试图在不受信任的层中计算字符串的std :: hash,然后在安全区域内进行验证。由于安全区具有自己的stdlib实现,因此实现有所不同,因此std :: hash:(