Another best practice: Please do not use logging as an excuse to avoid implementing proper error propagation in libraries or utility code.
Bad:
void something_failable(void *data) {
if (!is_valid(data)) {
log_err("invalid data");
}
/* ... */
}
Less bad: int something_failable(xxx_t *ctx, void *data) {
if (!is_valid(data)) {
return xxx_err(ctx, "invalid data");
}
/* ... */
}