|| hoping this is the right place for this: || I stumbled upon documentation regarding the use of `assert` in C++ || code, in particular, || https://cran.r-project.org/web/packages/policies.html states that || || ``` || Thus C/C++ calls to assert/abort/exit/std::terminate, Fortran calls to || STOP and so on must be avoided. || ``` || || , which goes against all best practice guidelines I'm aware of. | |Yes and no. | |Defensize programming is good, of course, but `assert()` leads to an `abort()` and immediate abort which for an _environment_ such as R is really not appropriate. You want a proper error return (i.e. Rf_error with a message or alike) to the R prompt. | |Note that you can always test something like this; there are several packages allowing ad-hoc compilation from `inline` to `Rcpp` and others. So here: | | > Rcpp::cppFunction(r"(void ohnoes() { assert(false); })", includes=c("#undef NDEBUG", "#include <assert.h>")) | > ohnoes() | R: file2cd1353560062b.cpp:8: void ohnoes(): Assertion `false' failed. | | Process R:3 aborted (core dumped) at Wed Dec 18 16:22:19 2024 | |... and that took my R session down just like `assert()` is expected. Also note the trickery I had to do to re-enable `assert()` by undefining `NDEBUG` and including the header after that.
Exactly! You had to jump through a lot of hoops to even make assert() crash your R session. This would _not_ happen in production code. So a developer of an R extension could happily use asserts, then use your method to test his/her code. No need to remove the asserts, since NDEBUG is defined in production. | |So viewed from that angle, it really is not against _best practices for R extensions_ which is what the CRAN Policy is about. I'm not following this argument, since you (in my eyes) actually made a point for the opposite (see above). Keeping in mind that R is used mostly for scientific purposes I'd favor correctness over inconenviences like a crashing R session (keeping in mind that it would not even crash as per the arguments above). Encouraging asserts() would be a more C++-like experience for the developer, resulting in safer, more robust code, which is a good thing. Just my 50ct. cheers Chris | |Cheers, Dirk | || Therefore I would propose to remove 'assert' from the above statement. || In support, || https://cran.r-project.org/doc/manuals/r-release/R-exts.html || states that || || ``` || One usage that could call abort is the assert macro in C or C++ || functions, which should never be active in production code. The normal || way to ensure that is to define the macro NDEBUG, and R CMD INSTALL || does so as part of the compilation flags. || ``` || which seems a reasonable thing to do. || || As a sidenote, the guide could be extended to encourage new mechanisms || available in modern C++ like `static_assert`. || || || Cheers || Chris || || ______________________________________________ || R-package-devel@r-project.org mailing list || https://stat.ethz.ch/mailman/listinfo/r-package-devel | |-- |dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org |
______________________________________________ R-package-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-package-devel