On 3/15/24 2:35 PM, yla...@apache.org wrote:
> Author: ylavic
> Date: Fri Mar 15 13:35:04 2024
> New Revision: 1916337
>
> URL: http://svn.apache.org/viewvc?rev=1916337&view=rev
> Log:
> apr_general: Use __builtin_offsetof for APR_OFFSETOF if available. PR 68763.
>
> Sanitizers might warn about &((type *)0)->field being UB, so use the builtin
> which is meant to avoid it.
>
>
> Modified:
> apr/apr/trunk/include/apr_general.h
>
> Modified: apr/apr/trunk/include/apr_general.h
> URL:
> http://svn.apache.org/viewvc/apr/apr/trunk/include/apr_general.h?rev=1916337&r1=1916336&r2=1916337&view=diff
> ==============================================================================
> --- apr/apr/trunk/include/apr_general.h (original)
> +++ apr/apr/trunk/include/apr_general.h Fri Mar 15 13:35:04 2024
> @@ -106,7 +106,9 @@ typedef enum { APR_WAIT_READ, APR_WAIT_W
> * @param field data field within the structure
> * @return offset
> */
> -#if defined(offsetof) && !defined(__cplusplus)
> +#if defined(__has_builtin) && __has_builtin(__builtin_offsetof)
This causes an
./include/apr_general.h:109:45: error: missing binary operator before token "("
with gcc 8.5.0 for me. Following
https://gcc.gnu.org/onlinedocs/cpp/_005f_005fhas_005fbuiltin.html
and changing it to
Index: include/apr_general.h
===================================================================
--- include/apr_general.h (revision 1916382)
+++ include/apr_general.h (working copy)
@@ -106,13 +106,18 @@
* @param field data field within the structure
* @return offset
*/
-#if defined(__has_builtin) && __has_builtin(__builtin_offsetof)
+#if defined(__has_builtin)
+#if __has_builtin(__builtin_offsetof)
#define APR_OFFSETOF(s_type,field) __builtin_offsetof(s_type,field)
-#elif defined(offsetof) && !defined(__cplusplus)
+#endif
+#endif
+#if !defined(APR_OFFSETOF)
+#if defined(offsetof) && !defined(__cplusplus)
#define APR_OFFSETOF(s_type,field) offsetof(s_type,field)
#else
#define APR_OFFSETOF(s_type,field) APR_OFFSET(s_type*,field)
#endif
+#endif
Looks like to me that __has_builtin does not like to be used within an '&&'
operation for whatever reason.
> +#define APR_OFFSETOF(s_type,field) __builtin_offsetof(s_type,field)
> +#elif defined(offsetof) && !defined(__cplusplus)
> #define APR_OFFSETOF(s_type,field) offsetof(s_type,field)
> #else
> #define APR_OFFSETOF(s_type,field) APR_OFFSET(s_type*,field)
>
>
>
Regards
RĂ¼diger