【问题标题】:Can template metaprogramming be used to encrypt compile-time constant data?模板元编程可以用来加密编译时常量数据吗?
【发布时间】:2013-09-01 21:46:49
【问题描述】:

模板元编程可以用来加密编译时常量数据吗?

让我用一个例子来解释我的意思。假设我记录有关失败代码行的信息,如下所示:

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

是否有可能(使用模板元编程或其他魔法)编写Log(),以便替换__FILE__ 的编译时常量字符串被加密,以便二进制中使用的实际数据是编译-time 加密字符串?如果不是,为什么?

【问题讨论】:

    标签: c++ encryption template-meta-programming


    【解决方案1】:

    你的假设是错误的。 C99 只定义了__func__,但GCC 提供__FUNCTION____PRETTY_FUNCTION__ 作为扩展,它们的行为相同。它们都不是,而是标识符。例如。 C11,6.4.2.2:

    标识符__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;
    }
    

    【讨论】:

    • 感谢__FUNCTION__ 的提醒 - 为了清楚起见,我将其更改为__FILE__,因为我不想让实际问题偏离__FUNCTION__ 是文字还是静态或const 与否,但无论if 是否,那么是否可以 加密?
    • @JohannGerell:哦,好的。嗯,是的,因为__FILE__ 是一个常量表达式。你可以修复我的get 做一些聪明的事情。
    【解决方案2】:

    对于 C++11,应该可以使用可以在编译时评估的简单 constexpr 函数。这应该比一些模板元编程更具可读性(但是,它可能会默默地回退到函数的运行时评估——这在您的情况下可能是可取的,也可能不是可取的)。还要考虑@KerrerSB 写的关于__func__ 不是常量表达式的内容。

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多