Hello Richy, Richard B. Kreckel wrote:
I'm proceeding with the convertion to throwing exceptions. However, I'm feeling unconfident with some of them. Many of the cl_abort calls should really be assertions IMO. Is there a point throwing at a code section that cannot possibly be reached, except when someone seriously screws up CLN?
You're right, "not reached"/"internal error"/"assertion" are a different type of situation: here the culprit is inside CLN. How to signal this situation? - through abort()? - through throw internal_error(...)? I don't like abort() in the context of CLN, since it would create huge coredumps (1 GB is not rare), and eating that much of a user's disk is simply not nice. Therefore I'm in favour of an exception class that can be used for "not reached"/"internal error"/"assertion".
One of the most striking examples is the definition of CL_DEFINE_CONVERTER in include/cln/object.h. The conditional there could even be written as a compile-time assertion!
Yes, please make it a compile-time assertion! if (sizeof(*this) != sizeof(target_class)) cl_abort(); becomes typedef int verify_size_in_CL_DEFINE_CONVERTER[2*(sizeof(*this)==sizeof(target_class))-1]; Also, there is the documented use of cl_abort in the manual, section "Debugging support". How can we keep this functionality, i.e. have a way to put a breakpoint in a single place, so that the program execution stops there after any CLN exception is constructed but before it is thrown? Does "break __cxa_throw" work? If not, it can be done by defining an empty function cl_exception_breakpoint(){} and calling this function at the end of the constructor of every concrete CLN exception class. Bruno