public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Sergey Bugaev <bugaevc@gmail.com>
To: Florian Weimer <fweimer@redhat.com>
Cc: Siddhesh Poyarekar <siddhesh@redhat.com>, libc-alpha@sourceware.org
Subject: Re: [PATCH v2 0/3] fcntl fortification
Date: Tue, 30 May 2023 13:46:23 +0300	[thread overview]
Message-ID: <CAN9u=HdxGf8neZ=YToRbieNLftBCSMjqKt5faGgKv6GP3CYgUg@mail.gmail.com> (raw)
In-Reply-To: <87wn0qw88m.fsf@oldenburg.str.redhat.com>

On Tue, May 30, 2023 at 11:09 AM Florian Weimer <fweimer@redhat.com> wrote:
> > 2. There is a __fcntl_types_compatible () macro which is a thin wrapper
> >    over __builtin_types_compatible_p () in plain C, and uses an
> >    std::is_same_v-like check (using partial template specialization) in
> >    C++. Importantly, it uses __typeof () even in C++ (not decltype ()),
> >    because we don't want the extra references appended to our type. For
> >    example, we want 'int', not 'const int &' or 'int &&'.
>
> I think you should avoid using __typeof, otherwise we need to add
> another GCC check.  If you need to use decltype, you'll have to add a
> __cplusplus version check.

I don't think I understand your point about the GCC check, could you
please expand?

__typeof seems to have already been supported in very ancient GCC
versions [0], certainly much earlier than __VA_OPT__ support has
appeared. Clang supports typeof too.

[0]: https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC68

> > 5. Here's the fcntl () macro in all of its horrible glory:
> >
> >    #define fcntl(fd, cmd, ...)
> >      (__VA_OPT__ (0 ?) __fcntl_2_inline (fd, cmd)
>
> I think we should avoid the new __fcntl_2 symbol because it an
> unnecessary optimization.

And again I don't think I understand your point :|
Could you please expand here as well? What's the (unnecessary)
optimization here?

__fcntl_2 is required to do runtime checking of whether the runtime
value of CMD indeed does not require a third argument.
__fcntl_2_inline does the check at compile time if possible, and
either emits an error or calls the __fcntl_alias, otherwise it calls
through to the __fcntl_2. This all could be done inside the fcntl
macro as well, I just chose to move it to the inline function because:

- this is way more readable, the macros are unreadable enough already;
- this way it can be shared between fcntl and fcntl64;
- it *is* possible to do this part in a function rather than a macro,
  unlike everything else, because it doesn't require us to pass through
  the untyped 'arg'.

> It would very nice if we could generate the appropriate warning for C
> (-Wincompatible-pointer-types).  This is what I tried to do, but it
> might actually be impossible.
>
> Should we generate errors for C++?  It requires compatible pointer
> types, after all.

So the way I think about this, what this is doing is not making fcntl
into a proper type-safe overloaded function, but adding some
safeguards on top of the existing vararg definition that catch some
mistakes.

The diagnostics emitted are different, and this is fine. Another
instance of this: you get the "error: call to '__fcntl_missing_arg'
declared with attribute error" and not the error you would otherwise
get from GCC upon forgetting a required function argument ("error: too
few arguments to function 'foo'").

I would prefer to keep type mismatch a warning in C++ too (because
this is best-effort additional safeguards, not a real type system),
but this would be easy to change if you want me to.

> > I have only really tested with (modern) GCC. I briefly checked with
> > Clang, but the fortification doesn't seem to get enabled at all; perhaps
> > it's failing some other check.
>
> Which Clang version?

$ clang --version
clang version 16.0.4 (Fedora 16.0.4-1.fc38)

I now checked again, and what's happening is Clang doesn't seem to
have __builtin_va_arg_pack -- which is no longer required for the
fcntl fortification, so this would be resolved once I move it to a
separate fcntl3.h header.

Sergey

  reply	other threads:[~2023-05-30 10:46 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-28 17:20 Sergey Bugaev
2023-05-28 17:20 ` [PATCH v2 1/3] support: Add support_fcntl_support_ofd_locks () Sergey Bugaev
2023-05-29 13:18   ` Adhemerval Zanella Netto
2023-05-28 17:20 ` [PATCH v2 2/3] cdefs.h: Define __glibc_warn_system_headers_{begin,end} Sergey Bugaev
2023-05-29 14:50   ` [PATCH v2 2/3] cdefs.h: Define __glibc_warn_system_headers_{begin, end} Adhemerval Zanella Netto
2023-05-28 17:20 ` [PATCH v2 3/3] io: Add FORTIFY_SOURCE check for fcntl arguments Sergey Bugaev
2023-05-29 16:54   ` Adhemerval Zanella Netto
2023-05-29 17:31     ` Sergey Bugaev
2023-05-29 18:09       ` Adhemerval Zanella Netto
2023-05-29 19:57         ` Sergey Bugaev
2023-05-29 20:14           ` Adhemerval Zanella Netto
2023-05-29 20:49             ` Sergey Bugaev
2023-05-29 21:09               ` Adhemerval Zanella Netto
2023-05-29 21:59                 ` Sergey Bugaev
2023-05-30 11:34                   ` Adhemerval Zanella Netto
2023-05-30  7:41         ` Florian Weimer
2023-05-30  9:07           ` Sergey Bugaev
2023-05-30  9:50             ` Florian Weimer
2023-05-30 11:35               ` Adhemerval Zanella Netto
2023-05-30  8:09 ` [PATCH v2 0/3] fcntl fortification Florian Weimer
2023-05-30 10:46   ` Sergey Bugaev [this message]
2023-05-30 11:08     ` Florian Weimer
2023-05-30 11:34       ` Sergey Bugaev
2023-05-30 11:50         ` Florian Weimer
2023-05-30 11:51         ` Florian Weimer
2023-05-30 12:15           ` Sergey Bugaev
2023-05-30 12:26             ` Florian Weimer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAN9u=HdxGf8neZ=YToRbieNLftBCSMjqKt5faGgKv6GP3CYgUg@mail.gmail.com' \
    --to=bugaevc@gmail.com \
    --cc=fweimer@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=siddhesh@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).