Avoid casting function pointer in libutil test support

Casting function pointers seems to be almost always UB.
See https://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type

Fixed by doing the casting of `void*` to `std::string*` inside the function instead.

Caught by UBSan.
This commit is contained in:
Las Safin 2024-07-16 21:05:16 +00:00
parent 9c6678da0e
commit 5b6a21acc5
No known key found for this signature in database
2 changed files with 5 additions and 5 deletions

View file

@ -2,9 +2,10 @@
namespace nix::testing { namespace nix::testing {
void observe_string_cb(const char * start, unsigned int n, std::string * user_data) void observe_string_cb(const char * start, unsigned int n, void * user_data)
{ {
*user_data = std::string(start); auto user_data_casted = reinterpret_cast<std::string *>(user_data);
*user_data_casted = std::string(start);
} }
} }

View file

@ -3,14 +3,13 @@
namespace nix::testing { namespace nix::testing {
void observe_string_cb(const char * start, unsigned int n, std::string * user_data); void observe_string_cb(const char * start, unsigned int n, void * user_data);
inline void * observe_string_cb_data(std::string & out) inline void * observe_string_cb_data(std::string & out)
{ {
return (void *) &out; return (void *) &out;
}; };
#define OBSERVE_STRING(str) \ #define OBSERVE_STRING(str) nix::testing::observe_string_cb, nix::testing::observe_string_cb_data(str)
(nix_get_string_callback) nix::testing::observe_string_cb, nix::testing::observe_string_cb_data(str)
} }