c – 如何确保在运行时永远不会调用constexpr函数?

前端之家收集整理的这篇文章主要介绍了c – 如何确保在运行时永远不会调用constexpr函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设你有一个函数可以为应用程序生成一些安全性令牌,例如一些散列盐,或者一个对称或不对称密钥.

现在让我们说你在C中有这个功能作为一个constexpr,并且你可以根据一些信息(比如编号,时间戳,别的东西)为你的build生成密钥.

你是一个勤奋的程序员,确保并以适当的方式调用它,以确保它只在编译时被调用,因此死机器从最终的可执行文件删除代码.

但是,您无法确定别人不会以不安全的方式调用它,也可能编译器不会将功能删除,然后您的安全令牌算法将成为公共知识,使其成为更容易被攻击者猜测未来的令牌.

或者,除了安全性,假设该功能需要很长时间才能执行,并且您希望确保它在运行时不会发生,并为您的最终用户造成糟糕的用户体验.

有没有办法确保在运行时永远不能调用一个constexpr函数?或者,也可以在运行时抛出一个assert或者类似的代码,但是并不像编译错误那么明显.

我听说有一些方法涉及抛出一个不存在的异常类型,所以如果constexpr函数没有被破坏,你会得到一个链接错误,但是听说这只适用于一些编译器.

遥相关问题:Force constexpr to be evaluated at compile time

解决方法

你可以强制使用它在一个常量表达式中:
#include<utility>

template<typename T,T V>
constexpr auto ct() { return V; }

template<typename T>
constexpr auto func() {
    return ct<decltype(std::declval<T>().value()),T{}.value()>();
}

template<typename T>
struct S {
    constexpr S() {}
    constexpr T value() { return T{}; }
};

template<typename T>
struct U {
    U() {}
    T value() { return T{}; }
};

int main() {
    func<S<int>>();
    // won't work
    //func<U<int>>();
}

通过使用函数的结果作为模板参数,如果在编译时无法解决,则会出现错误.

猜你在找的C&C++相关文章