lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 2 Feb 2022 21:43:08 +0100 From: Miguel Ojeda <miguel.ojeda.sandonis@...il.com> To: Kees Cook <keescook@...omium.org> Cc: Jonathan Corbet <corbet@....net>, Linus Torvalds <torvalds@...ux-foundation.org>, Martin Uecker <Martin.Uecker@....uni-goettingen.de>, Ingo Molnar <mingo@...nel.org>, Rikard Falkeborn <rikard.falkeborn@...il.com>, Arnd Bergmann <arnd@...db.de>, Linux Doc Mailing List <linux-doc@...r.kernel.org>, Tetsuo Handa <penguin-kernel@...ove.sakura.ne.jp>, Andrew Morton <akpm@...ux-foundation.org>, Andy Shevchenko <andy.shevchenko@...il.com>, Nick Desaulniers <ndesaulniers@...gle.com>, "Gustavo A. R. Silva" <gustavoars@...nel.org>, linux-kernel <linux-kernel@...r.kernel.org>, linux-hardening@...r.kernel.org Subject: Re: [PATCH] linux/const.h: Explain how __is_constexpr() works On Mon, Jan 31, 2022 at 9:43 PM Kees Cook <keescook@...omium.org> wrote: > > + * - The conditional operator ("... ? ... : ...") returns the type of the > + * operand that isn't a null pointer constant. This behavior is the Perhaps clarify that this happens only if it fits that case? ... > + * - If (x) is an integer constant expression, then the "* 0l" resolves it > + * into a null pointer constant, which forces the conditional operator > + * to return the type of the last operand: "(int *)". > + * - If (x) is not an integer constant expression, then the type of the > + * conditional operator is from the first operand: "(void *)". ... i.e. this one happens because it is specified as returning a pointer to void (one could read it as returning the type of the first operand). What about something like: - The behavior (including its return type) of the conditional operator ("... ? ... : ...") depends on the kind of expressions given for the second and third operands. This is the central mechanism of the macro. - If (x) is an integer constant expression, then the "* 0l" resolves it into a null pointer constant. When one operand is a null pointer constant and the other is a pointer, the conditional operator returns the type of the pointer operand; that is, "int *". - If (x) is not an integer constant expression, then that operand is a pointer to void (but not a null pointer constant). When one operand is a pointer to void and the other a pointer to an object type, the conditional operator returns a "void *" type. Cheers, Miguel
Powered by blists - more mailing lists