Cho phép nói rằng bạn có một chức năng tạo ra một số mã thông báo bảo mật cho ứng dụng của bạn, chẳng hạn như một số muối băm, hoặc có thể là một khóa symetric hoặc asymetric.Làm thế nào để đảm bảo chức năng constexpr không bao giờ được gọi là thời gian chạy?
Bây giờ hãy nói rằng bạn có hàm này trong C++ của bạn dưới dạng constexpr và bạn tạo khóa cho công trình xây dựng dựa trên một số thông tin (như số xây dựng, dấu thời gian, thứ gì đó khác).
Bạn là một lập trình viên siêng năng đảm bảo và gọi điều này theo những cách thích hợp để đảm bảo nó chỉ được gọi lúc biên dịch, và do đó kẻ giết người chết loại bỏ mã khỏi tệp thực thi cuối cùng. Tuy nhiên, bạn không bao giờ có thể chắc chắn rằng một người khác sẽ không gọi nó theo cách không an toàn hoặc có thể trình biên dịch sẽ không loại bỏ chức năng này, và sau đó thuật toán mã thông báo bảo mật của bạn sẽ trở thành công khai kiến thức, làm cho nó dễ dàng hơn cho sẽ là kẻ tấn công để đoán thẻ tương lai.
Hoặc, bảo mật sang một bên, giả sử hàm mất nhiều thời gian để thực thi và bạn muốn đảm bảo rằng nó không bao giờ xảy ra trong thời gian chạy và gây ra trải nghiệm người dùng tồi cho người dùng cuối của bạn.
Có cách nào để đảm bảo rằng chức năng constexpr không bao giờ có thể được gọi khi chạy không? Hoặc luân phiên, ném một khẳng định hoặc tương tự tại thời gian chạy sẽ là ok, nhưng không phải là lý tưởng rõ ràng là một lỗi biên dịch sẽ được.
Tôi nghe nói rằng có một số cách liên quan đến việc ném một loại ngoại lệ không tồn tại, để nếu hàm constexpr không bị deadstripped, bạn sẽ gặp lỗi linker, nhưng đã nghe nói rằng nó chỉ hoạt động trên một số trình biên dịch.
hàng xa câu hỏi: Force constexpr to be evaluated at compile time
Một giải pháp khả thi: bạn triển khai thực hiện chức năng đó đúng theo điều khoản của 'mẫu <...> struct xyz {static constexpr long long value = ...; } '. Không, thực sự, ý tôi là không sử dụng hàm 'constexpr' nhưng thực hiện các tính toán chặt chẽ trong các khuôn mẫu struct. –
Lưu ý rằng nó thường đồng ý rằng nếu biết thuật toán của bạn là đủ cho nó bị phá vỡ, sau đó thuật toán của bạn là crap. – immibis
Đó là một bình luận chung tốt để làm cho folks những người có thể đi qua câu hỏi này và muốn cung cấp cho nó một thử, nhưng FWIW nhu cầu của tôi không liên quan đến an ninh. –