Allow Empty Format Strings in Error Macro Invocations
`-Wall` implies `-Wformat-zero-length`, which will cause compilation to fail under `-Werror` when an empty string is passed as the format string to a `printf`-family function. This commit moves us back to prefixing the provided format string, which successfully avoids that warning. However, this removes the failure mode where that `RAWLOG` invocation would fail to compile when no format string was provided at all (which was desirable to avoid having code that would successfully compile normally but fail under `-pedantic`, which *does* require that a non-zero number of args are provided). So this commit also introduces a function which does nothing at all, but will fail to compile if not provided with at least one argument, which is a string. This successfully links the compilability of pedantic and non-pedantic builds.
This commit is contained in:
parent
6696933b32
commit
450542d3a7
@ -53,6 +53,10 @@ extern "C" {
|
|||||||
#define MIN(a,b) ((a)<(b) ? (a) : (b))
|
#define MIN(a,b) ((a)<(b) ? (a) : (b))
|
||||||
#define MAX(a,b) ((a)>(b) ? (a) : (b))
|
#define MAX(a,b) ((a)>(b) ? (a) : (b))
|
||||||
|
|
||||||
|
static INLINE_KEYWORD UNUSED_ATTR void _force_has_formatting_string(const char *format, ...) {
|
||||||
|
(void)format;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the specified error if the condition evaluates to true.
|
* Return the specified error if the condition evaluates to true.
|
||||||
*
|
*
|
||||||
@ -62,8 +66,10 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define RETURN_ERROR_IF(cond, err, ...) \
|
#define RETURN_ERROR_IF(cond, err, ...) \
|
||||||
if (cond) { \
|
if (cond) { \
|
||||||
RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s: ", __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
|
RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
|
||||||
RAWLOG(3, __VA_ARGS__); \
|
__FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
|
||||||
|
_force_has_formatting_string(__VA_ARGS__); \
|
||||||
|
RAWLOG(3, ": " __VA_ARGS__); \
|
||||||
RAWLOG(3, "\n"); \
|
RAWLOG(3, "\n"); \
|
||||||
return ERROR(err); \
|
return ERROR(err); \
|
||||||
}
|
}
|
||||||
@ -75,8 +81,10 @@ extern "C" {
|
|||||||
*/
|
*/
|
||||||
#define RETURN_ERROR(err, ...) \
|
#define RETURN_ERROR(err, ...) \
|
||||||
do { \
|
do { \
|
||||||
RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s: ", __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
|
RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
|
||||||
RAWLOG(3, __VA_ARGS__); \
|
__FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
|
||||||
|
_force_has_formatting_string(__VA_ARGS__); \
|
||||||
|
RAWLOG(3, ": " __VA_ARGS__); \
|
||||||
RAWLOG(3, "\n"); \
|
RAWLOG(3, "\n"); \
|
||||||
return ERROR(err); \
|
return ERROR(err); \
|
||||||
} while(0);
|
} while(0);
|
||||||
@ -90,8 +98,10 @@ extern "C" {
|
|||||||
do { \
|
do { \
|
||||||
size_t const err_code = (err); \
|
size_t const err_code = (err); \
|
||||||
if (ERR_isError(err_code)) { \
|
if (ERR_isError(err_code)) { \
|
||||||
RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s: ", __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
|
RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
|
||||||
RAWLOG(3, __VA_ARGS__); \
|
__FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
|
||||||
|
_force_has_formatting_string(__VA_ARGS__); \
|
||||||
|
RAWLOG(3, ": " __VA_ARGS__); \
|
||||||
RAWLOG(3, "\n"); \
|
RAWLOG(3, "\n"); \
|
||||||
return err_code; \
|
return err_code; \
|
||||||
} \
|
} \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user