у меня есть vector<vector <string>> a
; Как я мог передать его в анклав? Как я объявляю функцию edl.
Пример объявления функции для приложения, edl и enclave очень важен.
Я знаю об этом: Аргументы C ++ для функций SGX Enclave Edge.
Образец, чтобы передать даже 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.
В использовании 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>)
, что правильно, потому что вы передаете массив указателей.
Чтобы закрыть, попав внутрь анклава, вам нужно скопировать данные указателей, потому что эти указатели находятся вне анклава, что можно сделать автоматически, назначив их std::string
,
Из документации Intel SGX SDK:
Обработка указателей (последний абзац)
Вы можете использовать атрибут направления, чтобы торговать для защиты производительности. В противном случае вы должны использовать
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)
.
Других решений пока нет …