2017-01-27 34 views
0

我想寫一個簡單的SGX飛地,需要在布爾值的矢量,但顯然edger8r創建C代碼;所以EDL碼C++的SGX領土邊緣函數的參數

enclave{ 

    from "sgx_tstdc.edl" import *; 
    #include "BetaDist.h" 
    #include <vector> 

    trusted { 
     BetaDist Estimate(std::vector<bool> X, double max_z, double max_delta); 
    }; 

    untrusted { 
    }; 
}; 

產生編譯錯誤(有趣的是,英特爾編譯器報告它的標題是「災難性的錯誤」下的)說法頭vector無法找到。

在我看來,這個問題可以通過用C++標記編譯輸出邊緣代碼來解決。這會起作用嗎?即使如此,是否還有更簡單的方法來執行此操作(即,使用C++標準類型參數的邊緣函數)? PS:我沒有足夠的代表來添加一個新的標籤,是否有人會用'edger8r'標記這個?我認爲這會有所幫助。

回答

1

#include是不正確的EDL語法。不需要散列 - include

ecalls和ocalls中的參數必須是C類型 - 因此,不支持vectorbool

對於vector您需要將其轉換爲C類型(可能會創建一個結構體或void指針),然後傳遞一個指針的長度。

對於bool,我猜,最好通過int來表示一個布爾值。

您還必須爲指針指定特殊的屬性:

  • [in] - 如果你想將它複製到飛地(你還需要指定它的長度)(又名按值傳遞)
  • [out] - 如果你想從飛地複製
  • [user_check] - 最簡單的選擇 - 你只需傳遞一個指針,飛地就會讀取和寫入不可信內存。 (又名通過指針)

不要忘了將參數轉換回C++類型!

+0

您可以爲您的建議解決方案添加一段代碼。它會更清楚 – Nipun