使用OCALL,我想将在不可信内存中动态创建的C字符串的副本放到我的enclave中。因此,我必须使用[out, string]属性。
但是,我不能这样做,因为我还必须添加[in]属性。问题是,我真的不知道字符串的大小,我不想每次创建[in]时,从enclave不必要地将字符串复制到不可信的内存,从而产生开销(这是由OCALL带来的)。
我的edl文件:
enclave {
trusted {
public void ecall_open(void);
};
untrusted {
void ocall_get_string([out, string] char* str);
};
};error: string/wstring/sizefunc should be used with an 'in' attribute
为什么要添加[in]属性?
出于性能方面的原因,有没有办法避免这种开销?
发布于 2017-08-06 22:40:56
我猜,一种解决方案是将一个指针传递给具有[out]属性和长度的char*:
void ocall_get_string([out] char** str, [out] size_t* length);
然后使用memcpy()手动将C字符串从不可信的内存复制到可信的。
在enclave内部:
char* untrusted_str; // pointer to string in untrusted memory that we would get form OCALL
size_t length; // length of string
ocall_get_string(&untrusted_str, &length);
char *trusted_str = new char[length]; // pointer to string in trusted memory
memcpy(trusted_str, untrusted_str, length);
// delete it later
delete[] trusted_str;发布于 2018-09-28 17:13:15
也许你应该试试这个:
void ocall_get_string([out, size=sz] char* str, size_t sz);
size=sz表示将自动复制回Enclave的str的大小。如果你不指定大小,那么只有一个字符会被复制回Enclave。
https://stackoverflow.com/questions/45532406
复制相似问题