Обсуждение: implicit casts from void*
I received on off-list report that commit e2809e3a101 causes an error when building an extension written in C++, since $subject is in a header file. The fix is simply to add an explicit cast, so I plan to push the attached soon. Bikeshedding: We could additionally change the pg_crc*.c files to make them consistent, but I have not done that yet. It seems we prefer explicit casts anyway but don't enforce that. -- John Naylor Amazon Web Services
Вложения
John Naylor <johncnaylorls@gmail.com> writes:
> I received on off-list report that commit e2809e3a101 causes an error
> when building an extension written in C++, since $subject is in a
> header file. The fix is simply to add an explicit cast, so I plan to
> push the attached soon.
Hmpfh. No objection to your patch, but I wonder why
"headerscheck --cplusplus" didn't find this? Can we get it
to do so?
> Bikeshedding: We could additionally change the pg_crc*.c files to make
> them consistent, but I have not done that yet. It seems we prefer
> explicit casts anyway but don't enforce that.
Meh. There are an awful lot of places where we assume such casts
are okay. I'm willing to adopt a stricter definition in header
files, but it feels like requiring it in .c files is useless
make-work. As a perhaps not quite exact parallel, we mostly
don't object to writing
if (ptr)
as a shortcut for
if (ptr != NULL)
though it's hard to see the former as anything but an implicit
cast to boolean.
regards, tom lane
On Tue, Jul 1, 2025 at 10:36 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > John Naylor <johncnaylorls@gmail.com> writes: > > I received on off-list report that commit e2809e3a101 causes an error > > when building an extension written in C++, since $subject is in a > > header file. The fix is simply to add an explicit cast, so I plan to > > push the attached soon. > > Hmpfh. No objection to your patch, but I wonder why > "headerscheck --cplusplus" didn't find this? Can we get it > to do so? Good question, and it turns out it catches it just fine, but you have to configure with CPPFLAGS="-msse4.2" (or run the script on a Red Hat 9-ish system). -- John Naylor Amazon Web Services
John Naylor <johncnaylorls@gmail.com> writes:
> On Tue, Jul 1, 2025 at 10:36 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Hmpfh. No objection to your patch, but I wonder why
>> "headerscheck --cplusplus" didn't find this? Can we get it
>> to do so?
> Good question, and it turns out it catches it just fine, but you have
> to configure with CPPFLAGS="-msse4.2" (or run the script on a Red Hat
> 9-ish system).
Ha, indeed you are right. On my RHEL9 box, it's kinda drowned out
by complaints about
/usr/include/c++/11/bits/range_access.h:109:3: error: template with C linkage
109 | template<typename _Tp> _Tp* end(valarray<_Tp>&) noexcept;
| ^~~~~~~~
/tmp/headerscheck.u5CrRM/test.cpp:1:1: note: ‘extern "C"’ linkage started here
1 | extern "C" {
| ^~~~~~~~~~
but looking closer, I do see some
./src/include/port/pg_crc32c.h: In function ‘pg_crc32c pg_comp_crc32c_dispatch(pg_crc32c, const void*, size_t)’:
./src/include/port/pg_crc32c.h:75:42: error: invalid conversion from ‘const void*’ to ‘const unsigned char*’
[-fpermissive]
75 | const unsigned char *p = data;
| ^~~~
| |
| const void*
regards, tom lane
On 02.07.25 09:01, John Naylor wrote:
> On Tue, Jul 1, 2025 at 9:24 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> Ha, indeed you are right. On my RHEL9 box, it's kinda drowned out
>> by complaints about
>>
>> /usr/include/c++/11/bits/range_access.h:109:3: error: template with C linkage
>> 109 | template<typename _Tp> _Tp* end(valarray<_Tp>&) noexcept;
>> | ^~~~~~~~
>> /tmp/headerscheck.u5CrRM/test.cpp:1:1: note: ‘extern "C"’ linkage started here
>> 1 | extern "C" {
>> | ^~~~~~~~~~
>
> After pushing my fix, I looked into this, and CI works around this by
> disabling ICU. A proper fix was discussed here, but it trailed off:
>
>
https://www.postgresql.org/message-id/flat/20230311033727.koa4saxy5wyquu6s%40awork3.anarazel.de#03346c63050bbc69dfca8981a5698e4a
>
> I came up with the attached -- Andres, Peter, does this match your recollection?
This looks sensible to me. Assuming that it works for this purpose, it
seems otherwise harmless.
John Naylor <johncnaylorls@gmail.com> writes: > After pushing my fix, I looked into this, and CI works around this by > disabling ICU. A proper fix was discussed here, but it trailed off: > https://www.postgresql.org/message-id/flat/20230311033727.koa4saxy5wyquu6s%40awork3.anarazel.de#03346c63050bbc69dfca8981a5698e4a > I came up with the attached -- Andres, Peter, does this match your recollection? I tested this on my RHEL9 box, and confirm that I get a clean build and headerscheck is silent. regards, tom lane
Hi,
On 2025-07-02 14:01:13 +0700, John Naylor wrote:
> On Tue, Jul 1, 2025 at 9:24 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
> > Ha, indeed you are right. On my RHEL9 box, it's kinda drowned out
> > by complaints about
> >
> > /usr/include/c++/11/bits/range_access.h:109:3: error: template with C linkage
> > 109 | template<typename _Tp> _Tp* end(valarray<_Tp>&) noexcept;
> > | ^~~~~~~~
> > /tmp/headerscheck.u5CrRM/test.cpp:1:1: note: ‘extern "C"’ linkage started here
> > 1 | extern "C" {
> > | ^~~~~~~~~~
>
> After pushing my fix, I looked into this, and CI works around this by
> disabling ICU. A proper fix was discussed here, but it trailed off:
>
>
https://www.postgresql.org/message-id/flat/20230311033727.koa4saxy5wyquu6s%40awork3.anarazel.de#03346c63050bbc69dfca8981a5698e4a
>
> I came up with the attached -- Andres, Peter, does this match your recollection?
I think the proper fix here would be to not expose ucol.h to the world,
i.e. not include it from something like pg_locale.h.
> diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h
> index 44ff60a25b4..300c78ba93c 100644
> --- a/src/include/utils/pg_locale.h
> +++ b/src/include/utils/pg_locale.h
> @@ -15,7 +15,12 @@
> #include "mb/pg_wchar.h"
>
> #ifdef USE_ICU
> +/* only include the C APIs, to avoid errors in cpluspluscheck */
> +#undef U_SHOW_CPLUSPLUS_API
> +#define U_SHOW_CPLUSPLUS_API 0
> #include <unicode/ucol.h>
> +/* restore so that extensions can include the C++ APIs */
> +#undef U_SHOW_CPLUSPLUS_API
> #endif
Does the #undef U_SHOW_CPLUSPLUS_API thing actually work, given that ucol.h
presumably won't be included again due to #ifdef protection?
Greetings,
Andres Freund
Andres Freund <andres@anarazel.de> writes:
> On 2025-07-02 14:01:13 +0700, John Naylor wrote:
>> I came up with the attached -- Andres, Peter, does this match your recollection?
> I think the proper fix here would be to not expose ucol.h to the world,
> i.e. not include it from something like pg_locale.h.
The stumbling block to that is that pg_locale_struct has a field of
type UCollator. Of course there are workarounds, but I think all of
them are strictly worse than including <ucol.h> here.
>> +/* restore so that extensions can include the C++ APIs */
>> +#undef U_SHOW_CPLUSPLUS_API
> Does the #undef U_SHOW_CPLUSPLUS_API thing actually work, given that ucol.h
> presumably won't be included again due to #ifdef protection?
Good point. If a .cpp file wants access to the C++ APIs, it'd have
to include <unicode/ucol.h> before not after including pg_locale.h.
That should work AFAICS, but this #undef doesn't help.
regards, tom lane
On Fri, Jul 4, 2025 at 10:11 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > Andres Freund <andres@anarazel.de> writes: > >> +/* restore so that extensions can include the C++ APIs */ > >> +#undef U_SHOW_CPLUSPLUS_API > > > Does the #undef U_SHOW_CPLUSPLUS_API thing actually work, given that ucol.h > > presumably won't be included again due to #ifdef protection? > > Good point. If a .cpp file wants access to the C++ APIs, it'd have > to include <unicode/ucol.h> before not after including pg_locale.h. > That should work AFAICS, but this #undef doesn't help. I see that now. If extensions follow the practice of including system headers before Postgres headers, it should be fine. I've attached v2 which removes the useless #undef and drafts an explanatory commit message. -- John Naylor Amazon Web Services
Вложения
John Naylor <johncnaylorls@gmail.com> writes:
> I see that now. If extensions follow the practice of including system
> headers before Postgres headers, it should be fine. I've attached v2
> which removes the useless #undef and drafts an explanatory commit
> message.
Works for me.
regards, tom lane
On Mon, Jul 7, 2025 at 11:06 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > John Naylor <johncnaylorls@gmail.com> writes: > > I see that now. If extensions follow the practice of including system > > headers before Postgres headers, it should be fine. I've attached v2 > > which removes the useless #undef and drafts an explanatory commit > > message. > > Works for me. Pushed. -- John Naylor Amazon Web Services
John Naylor <johncnaylorls@gmail.com> writes:
> On Mon, Jul 7, 2025 at 11:06 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> John Naylor <johncnaylorls@gmail.com> writes:
>>> I see that now. If extensions follow the practice of including system
>>> headers before Postgres headers, it should be fine. I've attached v2
>>> which removes the useless #undef and drafts an explanatory commit
>>> message.
>> Works for me.
> Pushed.
Just when you thought it was safe to go back in the water ...
I tried cpluspluscheck with late-model libicu (76.1 on Fedora 42)
and darned if it didn't blow up in exactly the same way.
Investigation reveals that they've split the "U_SHOW_CPLUSPLUS_API"
symbol into two, and now if you really really don't want any C++
stuff you need to also set "U_SHOW_CPLUSPLUS_HEADER_API" to zero.
I've confirmed that this re-silences the failures:
diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h
index 931f5b3b880..2b072cafb4d 100644
--- a/src/include/utils/pg_locale.h
+++ b/src/include/utils/pg_locale.h
@@ -18,6 +18,8 @@
/* only include the C APIs, to avoid errors in cpluspluscheck */
#undef U_SHOW_CPLUSPLUS_API
#define U_SHOW_CPLUSPLUS_API 0
+#undef U_SHOW_CPLUSPLUS_HEADER_API
+#define U_SHOW_CPLUSPLUS_HEADER_API 0
#include <unicode/ucol.h>
#endif
This shouldn't complicate extensions' lives any further than
before; the rule still is "include ICU headers first
if you want their C++ symbols".
BTW, I see that you applied ed26c4e25 only to master, but don't
we want to back-patch? cpluspluscheck is not just an exercise in a
vacuum, it's to ensure that C++-coded extensions don't have trouble
with our headers.
regards, tom lane
On Wed, Aug 6, 2025 at 12:26 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h > index 931f5b3b880..2b072cafb4d 100644 > --- a/src/include/utils/pg_locale.h > +++ b/src/include/utils/pg_locale.h > @@ -18,6 +18,8 @@ > /* only include the C APIs, to avoid errors in cpluspluscheck */ > #undef U_SHOW_CPLUSPLUS_API > #define U_SHOW_CPLUSPLUS_API 0 > +#undef U_SHOW_CPLUSPLUS_HEADER_API > +#define U_SHOW_CPLUSPLUS_HEADER_API 0 > #include <unicode/ucol.h> > #endif > > This shouldn't complicate extensions' lives any further than > before; the rule still is "include ICU headers first > if you want their C++ symbols". > > BTW, I see that you applied ed26c4e25 only to master, but don't > we want to back-patch? cpluspluscheck is not just an exercise in a > vacuum, it's to ensure that C++-coded extensions don't have trouble > with our headers. I was thinking that it was run only when developing new features, not for backpatch-able bug fixes, but that's a flawed assumption. I'll remedy that soon along with the new symbols above, unless you beat me to it. -- John Naylor Amazon Web Services
John Naylor <johncnaylorls@gmail.com> writes:
> On Wed, Aug 6, 2025 at 12:26 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> BTW, I see that you applied ed26c4e25 only to master, but don't
>> we want to back-patch? cpluspluscheck is not just an exercise in a
>> vacuum, it's to ensure that C++-coded extensions don't have trouble
>> with our headers.
> I was thinking that it was run only when developing new features, not
> for backpatch-able bug fixes, but that's a flawed assumption. I'll
> remedy that soon along with the new symbols above, unless you beat me
> to it.
Sounds good, thanks for dealing with it.
regards, tom lane
On Wed, Aug 6, 2025 at 7:16 PM John Naylor <johncnaylorls@gmail.com> wrote: > > BTW, I see that you applied ed26c4e25 only to master, but don't > > we want to back-patch? cpluspluscheck is not just an exercise in a > > vacuum, it's to ensure that C++-coded extensions don't have trouble > > with our headers. > > I was thinking that it was run only when developing new features, not > for backpatch-able bug fixes, but that's a flawed assumption. I'll > remedy that soon along with the new symbols above, unless you beat me > to it. This is done. -- John Naylor Amazon Web Services