Re: CFT: snmalloc as libc malloc (the nullptr_t issue)
Date: Fri, 10 Feb 2023 20:53:18 UTC
On Feb 10, 2023, at 12:01, Mark Millard <marklmi@yahoo.com> wrote:
> Looks to me like FreeBSD's problem: there is a rule about <stddef.h>
> inclusion leading to a definition of nullptr_t that is not being
> followed. The details follow.
>
> The complaint:
>
> /usr/obj/data/src/hardenedbsd/amd64.amd64/tmp/usr/include/c++/v1/cstddef:50:9: error: no member named 'nullptr_t' in the global namespace
> using ::nullptr_t;
>
> is reported against text in FreeBSD's usr/include/c++/v1/cstddef
> (so against the llvm15 integration).
>
> cppreference.com <http://cppreference.com/> reports for nullptr_t :
>
> . . .
> Defined in header <cstddef>
> using nullptr_t = decltype(nullptr);
>
> Notes
> nullptr_t is available in the global namespace when <stddef.h> is included, even if it is not a part of C99~C17 (referenced by C++11~C++20).
> nullptr_t is also a part of C since C23.
> . . .
>
> c++/v1/cstddef has, in part:
>
> . . .
> #include <stddef.h>
> #include <version>
>
> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
> # pragma GCC system_header
> #endif
>
> _LIBCPP_BEGIN_NAMESPACE_STD
>
> using ::nullptr_t;
> . . .
>
> But, in FreeBSD, <stddef.h> directly and indirectly does not lead to
> a nullptr_t definition as far as I could find.
>
I missed the fact that there is another stddef.h:
/usr/include/c++/v1/stddef.h
that looks like:
// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#if defined(__need_ptrdiff_t) || defined(__need_size_t) || \
defined(__need_wchar_t) || defined(__need_NULL) || defined(__need_wint_t)
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
#include_next <stddef.h>
#elif !defined(_LIBCPP_STDDEF_H)
#define _LIBCPP_STDDEF_H
/*
stddef.h synopsis
Macros:
offsetof(type,member-designator)
NULL
Types:
ptrdiff_t
size_t
max_align_t // C++11
nullptr_t
*/
#include <__config>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
#include_next <stddef.h>
#ifdef __cplusplus
typedef decltype(nullptr) nullptr_t;
#endif
#endif // _LIBCPP_STDDEF_H
So, another way of saying things is: this one seems to not be
in use but should be. Note the dependency on defined(__need_NULL)
for the initial #if .
===
Mark Millard
marklmi at yahoo.com