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>>(); } 通过使用函数的结果作为模板参数,如果在编译时无法解决,则会出现错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |