我有vector<vector <string>> a
;我怎么能把它传递到飞地?我如何声明edl函数。
非常感谢app,edl和enclave的示例函数声明。
我知道这一点:C++ Arguments to SGX Enclave Edge Functions。
即使是vector<string>
即可通过的示例也适合我。
UPDATE1: 我想出了这个:
App.cpp
const char *convert(const std::string & s)
{
return s.c_str();
}
vector<string> members_data;
member_data.push_back("apple");
member_data.push_back("orange"); //just for sample
std::vector<const char*> vc;
std::transform(members_data.begin(), members_data.end(), std::back_inserter(vc), convert);
EDL:
trusted {
public void ecall_receive_vector([in, size=len] const char **arr, size_t len);
};
飞地
void ecall_receive_vector(const char *arr[], size_t len)
{
vector<string> v(arr, arr+len);
printf("%s\n", v[2].c_str());
}
但是飞地没有收到任何数据,程序完美编译,没有错误。有人可以帮忙吗? printf是样本ocall。
答案 0 :(得分:2)
在EDL中使用count
代替size
。
trusted {
public void ecall_receive_vector([in, count=len] const char **arr, size_t len);
};
您正在传递一个双指针,它是指向char(char **
)的指针。
在编组/解组指针时,EDL处理器仅处理(复制和验证输入和输出)第一级间接,它由开发人员处理额外的间接级别。因此,对于一个指针数组,它只会复制第一个指针数组,而不是指向的值,复制它们是开发人员的责任。
如果未指定,则count
和size
分别默认为1
和sizeof(<pointed-type>)
。在您的情况size = sizeof(<pointer>)
中,大多数平台都是4
。
在您的情况下,您仅提供了size
。由于您没有提供来电者代码,我假设您传递了字符串的长度,并且未指定count
时默认为1
。然后,基于Total number of bytes = count * size
的总字节数将为1 * len
,这是错误的。
仅使用count
会将size
默认为sizeof(<pointed-type>)
,然后Total number of bytes = count * size
将为count * sizeof(<pointed-type>)
,这是正确的,因为您正在通过指针数组。
要关闭,一旦进入Enclave,你需要复制指针&#39;数据因为这些指针位于飞地之外,可以通过将它们分配给std::string
来自动完成。
来自英特尔SGX SDK文档:
Pointer Handling(最后一段)
您可以使用direction属性来保护性能。否则,您必须使用下面描述的
user_check
属性并在使用之前通过指针验证从不受信任的内存获得的数据,因为指针指向的内存可能会意外更改,因为它存储在不受信任的内存中。但是,方向属性 对包含指针的结构没有帮助。在这种情况下,开发人员必须自行验证和复制缓冲区内容,如果需要,可以递归 。
和
使用以下属性计算缓冲区大小的通用公式:
Total number of bytes = count * size
- 当指定
count
和size/sizefunc
时,上述公式成立。size
可以由size
或sizefunc
属性指定。- 如果没有为指针参数指定
count
,则假定它等于1
,即count=1
。然后总字节数等于size/sizefunc
。- 如果未指定
size
,则使用上述公式计算缓冲区大小,其中size
为sizeof (element pointed by the pointer)
。