public inbox for libc-help@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
To: Yair Lenga <yair.lenga@gmail.com>
Cc: libc-help@sourceware.org
Subject: Re: Buffer size checking for scanf* functions
Date: Wed, 6 Jul 2022 09:10:47 -0300	[thread overview]
Message-ID: <D978102C-941F-40DE-9E75-2604E256204C@linaro.org> (raw)
In-Reply-To: <C02D2DBD-B73C-466A-870D-48D3D8C9FA6B@gmail.com>



> On 5 Jul 2022, at 18:50, Yair Lenga <yair.lenga@gmail.com> wrote:
> 
> 
>> 
>> Adhemerval,
> 
> Thanks for taking time to review my posting.
> 
> I agree 100% with the critic on annex K. I believe there is (almost) universal agreement that it was half baked solution, rushed into the standard without proper review - which is why it got very little traction.
> 
> However, the fact the the annex K has many flaws does not mean that there are no good ideas in it. In particular, the ability to create “safer” vararg lists for atomic types, and use them in scanf* and similar, is significant improvement (IHMO). I believe it improve safety, while keeping code clean, readable, and can be used for many use cases (e.g., my scanf from a result set, parsing csv-like data, …).
> 
> Also worth mentioning that one mentioned alternative (OBS - object size checking) can fit into the proposed scanf change, given it ability to identify object sizes for static/dynamic char *.
> 
> Hoping to get feedback on my proposal for this limited use case.
> 
> Also, regarding the proposal for using stringifying macros, etc. Those are interesting ideas, but will break code clarity/readability . They Will not fit nicely into large scale projects, given their limitation (e.g. with dynamic size strings, etc.)
> 
> Thanks again for your time/ideas/feedback,

The main issue of extending standard interfaces with non standard 
functionality is the burden of keeping compatibility over releases.  
The scanf family itself requires glibc to provide multiple symbols
to handle C99, originally on glibc ‘a’ was synonymous of ‘m’ and 
the C standard defines ‘a’ to being synonymous of ‘f’.

It means that for -std=c99 glibc does a symbol redirection to a
different one to handle this difference.  If we add another non
standard extension it might require extra additional handling in
the future if C or POSIX reassign the conversion modifier to
something else.

We can follow the scanf_s idea and handle c, s, and [ conversion
as a pair or argument.  This will need also another symbol
redirection (since this interface is not compatible with standard
scanf family) and to export multiple new symbols.

I don’t have a a strong opinion, but if the idea is to add such 
extensions I think it would require some more discussion to avoid 
the scanf_s mistakes and maybe add some useful extension like to
handle non standard types supported by GCC (like int128 and
float128).

It also has the drawback to be an ad-hoc solution that will be
eventually phase out if standard ended up provide simila
functionality

I really think using current standard %m is really a much better 
approach than trying to extending scanf to use fixed sizes buffers.
It does dynamic allocation, but since your idea is to use dynamic
size strings anyway it might fit.

  reply	other threads:[~2022-07-06 12:10 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-05 21:50 Yair Lenga
2022-07-06 12:10 ` Adhemerval Zanella [this message]
2022-07-06 15:04   ` Yair Lenga
2022-07-11 12:38     ` Adhemerval Zanella
  -- strict thread matches above, loose matches on Subject: below --
2022-07-05  7:31 Yair Lenga
2022-07-05 12:39 ` Adhemerval Zanella

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=D978102C-941F-40DE-9E75-2604E256204C@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=libc-help@sourceware.org \
    --cc=yair.lenga@gmail.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).