Re: A: a new bug to old plain C

Александр Поваляев via Gcc-h elp <[email protected]>
Newsgroups gmane.comp.gcc.help,gmane.comp.gcc.devel
Message-ID <CAGT+J5zG-HAtXoDkAE6L7TBK3MutHgiHGST66aCgyWxSpJBMuA@mail.gmail.com>
Hi Jonathan :),

Truly speaking, I don't know what happened to change default behaviour for
type conversion. All these things have been known for 30years, many times
discussed and stabilized (in according to C standard, its warnings and
different levels of "pedantism").

Usually, C language is being used by a person who clearly understands what
he is doing and why.
C language is not a Python or Go, or Rust.
So, I don't think it makes additional sense to "protect" the person from
some possible unsafe conversions somehow.

I am an experienced person and when I'm going to make "Foo**" -> "const Foo
* const * const" conversion, I do clearly understand what I am doing.
And this is the real use-case from my practice which I use quite often.
If you are afraid of possible unsafe using of type conversion, you may
switch to Java or C#. It doesn't make sense to implement OS kernel or
driver real-time extensions if you feel you might be doing something wrong
or unsafe in your program. And for sure, it doesn't make sense to rely of
GCC warnings :)

Respectfully,
Aleksandr G Povaliaev.





сб, 6 дек. 2025 г. в 02:48, Jonathan Wakely <[email protected]>:

>
>
> On Wed, 3 Dec 2025, 13:01 Martin Uecker, <[email protected]> wrote:
>
>>
>> I am not sure this has been pointed out, but you can downgrade this
>> to a warning with -fpermissive.
>>
>
> Or with -Wno-incompatible-pointer-conversions
>
> It's been said more than once, but despite insisting on his "logic" and
> that he's correct, he doesn't actually read or understand most of the
> replies.
>
>
>
>
>> Otherwise, I do not quite I understand the point of this discussion.
>> Somebody needs to write a patch downgrading the warning in this
>> specific case (but not others that are problematic) to a pedantic
>> warning.  I would assume that such a patch would have a good chance
>> of being accepted.
>>
>> Martin
>>
>>
>>
>> Am Mittwoch, dem 03.12.2025 um 15:49 +0300 schrieb Александр Поваляев via
>> Gcc:
>> > Hi David! Thank you a lot for your time and postings!
>> >
>> > I agree that it should be an option and it should be a developer
>> decision
>> > whether to turn on/off pedantic errors.
>> > But as for now, we have no option whether to treat such conversion
>> ("Foo**"
>> > -> "const Foo * const * const") as an error or warning.
>> >
>> > Up to version 13.4 GCC x86-64 also treats it as a warning by default.
>> > So, if you compiles the following code snippet with x86-64 gcc 13.4 (
>> > godbolt.org was used)
>> > "
>> > struct zzz {
>> > unsigned x, y;
>> > };
>> >
>> > void subfunc(struct zzz const * const * const arg) {
>> >
>> > if (arg != NULL) {
>> > printf("%s", "Done!");
>> > }
>> > }
>> >
>> > void func(struct zzz ** arr_of_ptr, unsigned count) {
>> >
>> > subfunc(arr_of_ptr);
>> > }
>> > "
>> > you will get only the warning.
>> > So, starting from version 3.4.6 up to version 13.4 gcc x86-64 DOES
>> provide
>> > an option for decades.
>> >
>> > But then SOMETHING happened to version 14.1 of gcc x86-64, so it started
>> > returning an error.
>> > It BROKES BAKE COMPATIBILITY of safe conversion without any reasoning.
>> Is
>> > that right?
>> >
>> > The same change of default behaviour (when converting "Foo**" -> "const
>> Foo
>> > * const * const") is observed within POWER gcc compiler:
>> > it treated it as a warning starting from version 4.8.5 until the version
>> > 13.4. Starting from 14.1 POWER GCC returns an error.
>> > And the same story with versions happens for ARM GCC...
>> >
>> > ---------------------------------------------
>> >
>> > The interesting fact is that if you add "-std=c90 -pedantic" compiler
>> > options, all the versions will work FINE! returning a warning.
>> >
>> > So, the BUG IS ABOUT CHANGING OF DEFAULT GCC BEHAVIOUR WHEN CONVERTING
>> > "Foo**" -> "const Foo * const * const".
>> > IT BROKES BACK-COMPATIBILITY WITHOUT ANY VISIBLE REASON AND IT SHOULD BE
>> > FIXED!!!
>> >
>> > Respectfully,
>> > Aleksandr G Povaliaev.
>> >
>> > P.S. This e-mail would be much shorter if it had been less irrelevant
>> > examples and proofs.
>> >
>> >
>> > ср, 3 дек. 2025 г. в 12:02, David Brown <[email protected]>:
>> >
>> > > This has been explained to you repeatedly, by many people, on both the
>> > > gcc help list (which is for people asking for help about gcc, not for
>> > > people needing help with the C language) and the gcc developers list
>> > > (which is for discussing gcc development and is totally inappropriate
>> > > for your posts).
>> > >
>> > > It has been explained to you, repeatedly, that the C standards could
>> not
>> > > and do not have a list of "explicitly prohibited" conversions.  They
>> > > have a list of /allowed/ conversions.  You have been directed to
>> these,
>> > > with chapter and paragraph numbers and direct quotations from the
>> > > standards.  The conversion you want is not allowed in C as of C23 (and
>> > > before), though it is allowed in C++ and will likely be allowed in
>> > > future C versions.  The C standard term for "not allowed" here is
>> > > "constraint violation".  In C, /nothing/ is allowed unless it is
>> > > explicitly allowed in the standards.
>> > >
>> > > It does not matter if your use of this conversion is "safe" and gives
>> > > correct working code with some compilers, or when you add explicit
>> casts
>> > > to your C.  What matters is that the rules of C do not allow it.
>> > > Countless things can be considered "safe" and are yet not allowed by
>> the
>> > > C standards.
>> > >
>> > > When a conforming C compiler encounters a constraint violation - such
>> as
>> > > in your code - it is required to "issue a diagnostic".  This typically
>> > > means either a warning message (continuing compilation) or an error
>> > > message (halting compilation).  A compiler implementation can choose
>> > > either strategy.  Some compiler implementations will choose one,
>> others
>> > > will choose a different option - both are allowed.  Good compilers
>> > > (including gcc and clang) offer command-line options to let you
>> override
>> > > the compiler's default actions here.
>> > >
>> > > So it is fine that clang gives a warning and continues compilation.
>> It
>> > > is also fine that gcc gives an error and halts compilation.  (As a
>> > > general rule, I believe compilers should be strict by default but
>> allow
>> > > less strict modes by compiler flags, so I personally prefer gcc's
>> > > approach.)
>> > >
>> > > Neither gcc, clang, or any other compilers you tried have a bug here
>> > > (unless they didn't even give a warning).
>> > >
>> > >
>> > >
>> > > No matter what any compiler does with your code, your C code is
>> > > incorrect - it has a constraint violation.
>> > >
>> > >
>> > > This has all been explained to you several times.  It is quite
>> apparent
>> > > that you do not have familiarity with the C standards - the definition
>> > > of the language.  You are either incapable of understanding them, or
>> > > have not bothered trying - despite being spoon-feed the relevant
>> > > sections.  (No one expects you to read the entire standard.)  You are
>> > > not qualified to judge what is and is not allowed in C, or what is or
>> is
>> > > not a bug in a compiler.  You can have your opinions, but they are not
>> > > qualified or informed opinions, and as such they are worthless to
>> > > everyone else.  (A qualified and informed opinion would be "I know
>> this
>> > > is not allowed in C, but I think it should be".)
>> > >
>> > >
>> > > You should come away from all this with certain facts:
>> > >
>> > > 1. The conversion you want is not allowed in C.
>> > >
>> > > 2. It is extremely easy to write C code that /is/ valid, and works
>> > > exactly as you want - add an explicit cast.
>> > >
>> > > 3. GCC is never going to consider this behaviour a bug, and is never
>> > > going to change its behaviour here.
>> > >
>> > > I sincerely hope you understand facts 2 and 3 here.
>> > >
>> > > You can continue to beat your head against the wall claiming that 1
>> > > above is not true.  As long as it is your own head in the privacy of
>> > > your own room, go for it.  It won't change reality.
>> > >
>> > > No one can force you to understand this.  But I hope that you can
>> > > appreciate that your continued posts are a waste of everyone's time,
>> and
>> > > the practical way forward is just to change your code and stop posting
>> > > on these mailing lists.  I don't think anyone will particularly care
>> if
>> > > you go away thinking "we agree to disagree", or even "they are wrong
>> but
>> > > won't admit it" - just as long as you go away.
>> > >
>> > > Please let this be an end to these posts to the gcc mailing lists.  If
>> > > you want to email to me personally, go ahead - I am willing to try
>> again
>> > > to explain things to you if it stops you from wasting the time of
>> > > thousands of list members.  But if you continue, then it is perhaps
>> time
>> > > for the list administrators to consider blacklisting you (I know that
>> is
>> > > a step they are always very reluctant to take).
>> > >
>> > >
>> > >
>> > > On 03/12/2025 07:38, Александр Поваляев via Gcc wrote:
>> > > > Hi there! Thank you for being on it!
>> > > >
>> > > > You've written quite a lot of messages and replies. Thank you again
>> for
>> > > > this.
>> > > >
>> > > > However, I still don't see how you're proving that such a kind of
>> > > > conversion must be rejected by any C compiler within an error.
>> > > > Liu previously tried to do it (to provide logical reasoning), but
>> his
>> > > prove
>> > > > lacks some logical consistency.
>> > > > And so, I don't see that such conversion ("Foo**" -> "const Foo *
>> const *
>> > > > const) is NOT explicitly prohibited by C standard.
>> > > > And still there is no sign that what is not explicitly prohibited
>> by C
>> > > > standard should end up with a compiler error.
>> > > >
>> > > > Per my understanding, an error "diagnostic" message should be
>> present
>> > > only
>> > > > if there is a possible way of getting the program working wrong or
>> > > leading
>> > > > to fault.
>> > > > And a warning "diagnostic" message should be present if there is a
>> > > possible
>> > > > way of unsafe behavior.
>> > > > But in our case, a conversion "Foo**" -> "const Foo * const *
>> const" is
>> > > an
>> > > > absolutely safe way of coding.
>> > > >
>> > > > This is the reason why commercial compilers (like Microsoft/IBM and
>> > > Intel)
>> > > > DO support such a kind of conversion.
>> > > > And so this is an artefact.
>> > > > It appears when an absolutely safe way of coding which is not
>> explicitly
>> > > > prohibited by C standard is identified by an ERROR.
>> > > >
>> > > > I consider such behaviour as a BUG which should be fixed.
>> > > > This is my attitude.
>> > > >
>> > > > Respectfully,
>> > > > Aleksandr G Povaliaev.
>> > > >
>> > > >
>> > > >
>> > > >
>> > > >
>> > > > ср, 3 дек. 2025 г. в 06:08, Andrey Tarasevich <
>> [email protected]>:
>> > > >
>> > > > > It looks like we are getting nowhere here... To conclude this
>> > > "discussion"
>> > > > > I'll
>> > > > > reiterate just the relevant points as concisely as I can:
>> > > > >
>> > > > > 1. Standard C language does not allow the following pointer
>> conversions
>> > > as
>> > > > > implicit conversions:
>> > > > >
>> > > > >    T ** -> const T *const *
>> > > > >    T ** -> const T *const *const
>> > > > >
>> > > > > A program that attempts to rely on such conversions (as implicit
>> > > > > conversions) is
>> > > > > invalid, i.e. it contains a constraint violation - a "hard error"
>> in
>> > > > > standard C.
>> > > > >
>> > > > > 2. Compliant C compilers are required to issue diagnostic
>> messages for
>> > > > > constraint violations. Format and wording of such diagnostic
>> messages
>> > > are
>> > > > > not
>> > > > > standardized in any way. Standard C does not have concepts of
>> "errors"
>> > > or
>> > > > > "warnings".
>> > > > >
>> > > > > It is your responsibility to figure out that a diagnostic message
>> issued
>> > > > > for
>> > > > > this constraint violation indicates a "hard error", provided you
>> possess
>> > > > > sufficiently pedantic knowledge of C standard. If you don't
>> possess this
>> > > > > level
>> > > > > of knowledge of C standard (which is apparently the case in your
>> case),
>> > > > > but
>> > > > > still want to write code in standard C, configuration settings
>> like
>> > > > > `-pedantic-errors` will help you. Moreover, in the latter case,
>> you are
>> > > > > not
>> > > > > allowed to even approach C compilers without `-pedantic-errors`.
>> Trying
>> > > to
>> > > > > do so
>> > > > > will only lead to confusion.
>> > > > >
>> > > > > 3. If you do not have a "language-lawyer" level of knowledge of C
>> > > > > standard, you
>> > > > > do not get to make such bold statements as "I found a bug in C
>> > > compiler".
>> > > > > Which
>> > > > > is well-illustrated by this thread: in this case there's no bug.
>> The
>> > > > > compiler is
>> > > > > behaving 100% correctly, despite your claims to the contrary.
>> > > > >
>> > > > > 4. As it has been stated repeatedly, there's ongoing work aiming
>> to
>> > > > > support such
>> > > > > conversions in future iterations of C language standard. But as
>> of C23,
>> > > > > these
>> > > > > conversions are not supported (as implicit conversions).
>> > > > >
>> > > > > --
>> > > > > Best regards,
>> > > > > Andrey
>> > > > >
>> > > >
>> > >
>> > >
>>
>> --
>> Univ.-Prof. Dr. rer. nat. Martin Uecker
>> Graz University of Technology
>> Institute of Biomedical Imaging
>>
>>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.