From: Willy Tarreau Date: Sat, 14 Mar 2020 09:42:26 +0000 (+0100) Subject: MINOR: debug: add a new DISGUISE() macro to pass a value as identity X-Git-Tag: v2.2-dev5~61 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f4016683067b6ec31e294dbf0f6c1489baff8bd7;p=thirdparty%2Fhaproxy.git MINOR: debug: add a new DISGUISE() macro to pass a value as identity This does exactly the same as ALREADY_CHECKED() but does it inline, returning an identical copy of the scalar variable without letting the compiler know how it might have been transformed. This can forcefully disable certain null-pointer checks or result checks when known undesirable. Typically forcing a crash with *(DISGUISE(NULL))=0 will not cause a null-deref warning. --- diff --git a/include/common/compiler.h b/include/common/compiler.h index 7b086e310c..5578a58bc5 100644 --- a/include/common/compiler.h +++ b/include/common/compiler.h @@ -77,6 +77,11 @@ */ #define ALREADY_CHECKED(p) do { asm("" : "=rm"(p) : "0"(p)); } while (0) +/* same as above but to be used to pass the input value to the output but + * without letting the compiler know about its initial properties. + */ +#define DISGUISE(v) ({ typeof(v) __v = (v); ALREADY_CHECKED(__v); __v; }) + /* * Gcc >= 3 provides the ability for the program to give hints to the * compiler about what branch of an if is most likely to be taken. This