11

我有一个这样的 C++ 结构:

struct node                                                 
{
    string splitOn;                                         
    string label;                                           
    bool isLeaf;                                            
    vector<string> childrenValues;                          
    vector<node*> children;                                 
};

我想将它从应用程序传递或读取到英特尔 SGX 飞地。根据此处提到的内容:https ://software.intel.com/en-us/forums/intel-software-guard-extensions-intel-sgx/topic/703489

我试过这个:

应用程序:

node *root = new node;                                          
root = buildDecisionTree(dataTable, root, *tableInfo);  //this initializes the root
void *data3 = static_cast<void*>(root);
ecall_my_dtree(global_eid, &ecall_return, data3);

教育署:

  public int ecall_my_dtree([user_check] void* data);

飞地:

int ecall_my_dtree(void *data2)
node* root2 = static_cast<node*>(data2);

但似乎,root2 无法正确初始化,它指向垃圾。

关于 user_check:https ://software.intel.com/en-us/node/708978

关于如何正确读取飞地内数据的任何帮助。PS:英特尔 SGX enclave 不支持任何序列化库。

我也在这里问过类似的问题,但对我的小脑袋没有真正有用的答案。 https://github.com/intel/linux-sgx/issues/229

4

1 回答 1

1

你不应该这样做:

struct node                                                 
{
    string splitOn;                                         
    string label;                                           
    bool isLeaf;                                            
    vector<string> childrenValues;                          
    vector<node*> children;                                 
};

可能的问题:

  • STL 不保证其大多数类型的二进制兼容性:即std::stringstd::vector.

  • SGX 对 STL 的实现只是它的一个修改/简化的子集。

  • 您可能会遇到与内存对齐相关的问题。

您应该为此实现自定义序列化。

于 2018-05-03T15:23:00.490 回答