英特尔SGX将c++类/结构作为void*传递到飞地并将其强制转换回
Intel SGX Passing c++ class/struct as void* to enclave and casting it back
注意:-这个问题与在英特尔SGX中从应用程序将C++结构传递到飞地非常相似。我再次发布它,因为这篇帖子已经快1年了,希望有一些解决方案。如果你认为这是重复的,请删除它。
我正在开发一款英特尔SGX应用程序。在我不受信任的应用程序中,我有一个类(名为SkipList),里面有一个结构(名为节点)。我正试图将此结构作为带有**[user_check]属性的*void***传递到飞地中。
struct node {
size_t key;
T2 value;
vector<size_t> hashlabel;
vector<node*> forward;
};
一旦我在飞地中收到这个消息,我就会将其转换为如下所示的结构类型。
SkipList<int,string>::node* head = static_cast<SkipList<int,string>::node*>(Node);
当我开始调试它时,我看到强制转换后"head"的地址是正确的(我在应用程序端也检查了这个地址,两个地址都相同),而且"forward"成员的地址也是正确的。但当我试图看到"前进"的元素时,我只能看到一个元素。实际上应该有更多的15个元素。
有人能告诉我这是否是SGX STL矢量实现的问题吗?为什么我不能按预期看到它?
我解决了这个问题。
问题出在我的节点结构上。如果看到结构的第二个成员,则它是一个模板参数。我在运行时将其设置为string类型。但是字符串的大小在编译时并不是固定的。由于编译器不知道字符串的长度,所以无法正确地键入
SkipList<int,string>::node* head = static_cast<SkipList<int,string>::node*>(Node);
因此,解决方案是将成员值移动到结构的末尾:)。
现在我又进步了,陷入了另一个问题。问题是字符串的std::hash计算在包围区内外都有所不同。我正在尝试计算不受信任层中字符串的std::hash,然后在飞地内验证它。由于飞地有自己的stdlib实现,因此实现不同,因此std::hash:(
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++