ya0guang commented on a change in pull request #5:
URL: 
https://github.com/apache/incubator-teaclave-website/pull/5#discussion_r695803212



##########
File path: 
site/blog/2021-08-13-developing-sgx-application-with-teaclave-sgx-sdk.md
##########
@@ -269,32 +269,90 @@ pub fn intersection(nums1: Vec<i32>, nums2: Vec<i32>) -> 
Vec<i32> {
     }
 ```
 
-需要调用该函数时,在 `say_something` 中添加:
+考虑一个比较现实的场景,两个用户分别将自己的向量作为参数传入 enclave 中进行计算,这时候数据需要从不可信代码区域复制到可信代码区域。
+首先,需要在 `Enclave.edl` 文件中修改 `say_something` 函数的定义,输入参数为两个用户的向量指针以及对应的大小。
+```edl
+public sgx_status_t say_something([in, size=len1] size_t* num1, size_t len1,
+                                  [in, size=len2] size_t* num2, size_t len2);
+```
+
+接着,在 `app.c` 文件中声明需要求交集的数组以及大小并仿照示例调用 `say_something`。 
+
+```c
+    size_t nums1[10] = {0,1,2,3,4,5,6,7,8,9};
+    size_t nums2[10] = {5,6,7,8,9,10,11,12,13,14};
+    size_t len1 = sizeof(nums1);
+    size_t len2 = sizeof(nums2);
+
+    sgx_ret = say_something(global_eid, 
+                            &enclave_ret,
+                            nums1,
+                            len1,
+                            nums2,
+                            len2);
+```
+
+回到 `enclave/src/lib.rs`,`say_something` 传进来的是两个向量的起始地址以及大小。
 ```rust
-    println!("\nTry intersection for our own");
-    let nums1: Vec<i32> = vec![1, 2, 3, 4, 5];
-    let nums2: Vec<i32> = vec![4, 5, 6, 7, 8];
-    let vec: Vec<i32> = intersection(nums1, nums2);
-    println!("intersection set is {:?}", vec);
+pub extern "C" fn say_something(nums1: *mut usize, len1: usize, nums2: *mut 
usize, len2: usize) -> sgx_status_t 
+```
+由于数据是从非安全区复制到安全区的,还需要对 `intersection` 
函数进行部分改写。传进来的参数是向量指针,以指针地址为起始地址,根据大小参数限制迭代范围并获得一个用于循环的序号变量 `i`,在 `for` 循环中使用 
`offset` 偏移指针,解引用它,读出 `nums1` 和 `nums2` 的元素值。
 
+```rust
+pub fn intersection(nums1: *mut usize, len1: usize, nums2: *mut usize, len2: 
usize) -> Vec<usize> {
+    use std::collections::HashSet;
+    let mut set: HashSet<usize> = HashSet::new();
+    let mut vec: Vec<usize> = Vec::new();
+
+    for i in 0..len1/mem::size_of::<usize>() {
+        let mut val_nums1 = 0;
+        unsafe {
+            val_nums1 = *nums1.offset(i as isize);
+        }
+        set.insert(val_nums1); 
+    }
+    

Review comment:
       这里应该也可以使用`std::slice::from_raw_parts`来构建一个`&[<type>]`。




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: dev-unsubscr...@teaclave.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@teaclave.apache.org
For additional commands, e-mail: dev-h...@teaclave.apache.org

Reply via email to