簡體   English   中英

可以使用模板元編程來加密編譯時常量數據嗎?

[英]Can template metaprogramming be used to encrypt compile-time constant data?

可以使用模板元編程來加密編譯時常量數據嗎?

讓我用一個例子解釋一下我的意思。 假設我記錄了有關失敗代碼行的信息,如下所示:

if (index > MaxIndex) { Log(__FILE__); abort(); }

可能以某種方式(使用模板元編程或其他魔術)編寫Log()以便替換__FILE__的編譯時常量字符串被加密,以便二進制文件中使用的實際數據是編譯時加密字符串嗎? 如果沒有,為什么?

你的假設不正確。 C99僅定義__func__ ,但GCC提供__FUNCTION____PRETTY_FUNCTION__作為擴展,其行為相同。 它們都不是 ,而是標識符 例如C11,6.4.2.2:

標識符__func__應由翻譯器隱式聲明,就像緊跟在每個函數定義的__func__括號之后的聲明一樣

 static const char __func__[] = "function-name"; 

出現了,其中function-name是詞法封閉函數的名稱

不幸的是,在C ++ 11中, static const char []不是常量表達式,因此上述標識符都不能用作模板元程序參數。

(相比之下, __FILE____LINE__ 用文字替換的宏,所以你可以很好地靜態處理它們。)


(簡單的展示示例:)

template <unsigned int I, unsigned int N>
constexpr char get(char const (&arr)[N]) { return arr[I]; }

template <char C> struct Foo { };

int main()
{
    Foo<get<2>(__FILE__)>              ok;
    Foo<get<2>(__FUNCTION__)>        err1;   // "error: the value of ‘__func__’ is not usable in a constant expression"
    Foo<get<2>(__PRETTY_FUNCTION__)> err2;
    Foo<get<2>(__func__)>            err3;
}

使用C ++ 11,應該可以使用簡單的constexpr函數,這些函數可以在編譯時進行評估。 這應該比一些模板元編程更具可讀性(但是,它可能會默默地回退到函數的運行時評估 - 在您的情況下可能或可能不需要)。 還要考慮@KerrerSB寫的關於__func__不是常量表達式的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM