Re: A: a new bug to old plain C
Александр Поваляев via Gcc-h elp <[email protected]>
| Newsgroups | gmane.comp.gcc.help |
|---|---|
| Message-ID | <CAGT+J5zzDBF9khe8DrNWrX0OG4DFQn+z_ONPqtz0aa45T7pNpg@mail.gmail.com> |
[[Below]]... вт, 25 нояб. 2025 г. в 19:42, Jonathan Wakely <[email protected]>: > On Tue, 25 Nov 2025 at 16:09, Александр Поваляев <[email protected]> > wrote: > > > > Hi there! > > > > My code snippet which we're discussing was written in accordance with > the code safety recommendations provided by your colleagues :) > > So, the code snipped is naturally doing what was recommended in that C > FAQ: > > we're converting "Foo**" to "const Foo * const *" to avoid the possible > const-violations. > > That's not the C FAQ, that's the C++ FAQ, you are confused. > [[Aleksandr]] It doesn't matter since "Foo**" to "const Foo * const * const" conversion is in accordance with both C and C++. That is what I am trying to say :) > > > > > Here is a note from some recommendation which has been provided by your > colleagues ( > https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion) : > > What "colleagues" are you talking about? > [[Aleksandr]] It looks like you know them very good, so I proposed they are a kind of colleagues/may be friends of you. > > > "The rationale for why that error is a good thing is given below. But > first, here is the most common solution: simply change const Foo** to const > Foo* const*" > > And we are NOT converting "Foo**" to "const Foo**", we ARE converting > "Foo**" to "const Foo * const * const". > > Please pay some more attention to what I am writing here. > > We could say the same to you. > > > Then one more "const" is added since it is going to change neither the > value which the variable is pointing to nor the value of the variable > itself, since it denotes "end-of-loop iteration". > > Please, read carefully the use-case which I provided at the very > beginning of this e-mail thread. Here it is: > > " > > struct zzz const * const * const end_of_arr = arr_of_ptr + count; > > " > > And it should work fine. Since it is written in all the recommendations > and in accordance to C standard. > > No it isn't. > > > Nobody and no place and no recommendation forbid us from converting > "Foo**" to "const Foo * const * const". > > The C standard forbids it. > [[Aleksandr]] Where is that place in either C or C++ standard which forbids "Foo**" to "const Foo * const * const" conversion? > > > So, since it is allowed by C standard, it should work fine with all the > GCC toolchains. > > It isn't allowed by the C standard. Maybe by a future version of the C > standard, but not the current one. > > This should not be hard to understand, please try to read more carefully. > > > But with some of them, some of GCC toolchains (like GCC ARM trunk linux) > it doesn't. > > So, it should be fixed. > > > > Respectfully, > > Aleksandr G Povaliaev. > > > > > > > > вт, 25 нояб. 2025 г. в 14:58, Matthias Pfaller <[email protected]>: > >> > >> As several people already pointed out to you, this is not a bug in the > compiler. Your code is valid with C++, but invalid with C. Is this so hard > to understand? What you do is just like insisting on > >> > >> void f(int *); > >> void nonsense(void) > >> { > >> register int x; > >> f(&x); > >> } > >> > >> to be valid C code. It might look ok, but it's still invalid code. > >> > >> On 2025-11-25 12:28, Александр Поваляев wrote: > >> > >> Hi there! > >> > >> Yes. > >> Here is the original message from myself: " > >> struct zzz { > >> unsigned x, y; > >> }; > >> void square(struct zzz ** arr_of_ptr, unsigned count) { > >> // The first "const" produce an error (not a warning) within some GCC > toolchains, for example ARM GCC trunk (linux), see goldbolt.org > >> struct zzz const * const * const end_of_arr = arr_of_ptr + count; > >> // Without the first const "struct zzz * const * const end_of_arr = > arr_of_ptr + count;" it works fine!!! > >> } > >> ". > >> > >> So, somebody made this BUG to some GCC toolchains (ARM GCC trunk(linux) > and some others). We need to have it nailed down and fixed somehow. > >> > >> Respectfully, > >> Aleksandr G Povaliev. > >> > >> > >> вт, 25 нояб. 2025 г. в 13:32, Matthias Pfaller <[email protected]>: > >>> > >>> You are aware, that you are quoting the C++-FAQ? Aren't we talking > about C? > >>> > >>> Congratulations btw, you are (I think) the first person managing to > exhaust > >>> Jonathan's patience. I always thought he had a limitless source of > patience hidden > >>> somewhere and envied him for it... > >>> > >>> On 2025-11-25 11:24, Александр Поваляев via Gcc-help wrote: > >>> > We're not converting "Foo** -> const Foo**". We are doing "Foo** -> > const > >>> > Foo * const * const" conversion and this works fine (according to > the right > >>> > the same > >>> > https://isocpp.org/wiki/faq/const-correctness#constptrptr-conversion > which > >>> > was mentioned). > >>> > > >>> > So, what we're doing is correct from both language syntax and coding > >>> > practices (safe coding) points of view. > >>> > This bug should be reported and fixed!!! > >>> > > >>> > Respectfully, > >>> > Aleksandr G Povaliaev. > >>> > > >>> > пн, 24 нояб. 2025 г. в 20:49, Henrik Holst < > [email protected]>: > >>> > > >>> >> no they are not, they are a WIKIfication of the C specification, in > >>> >> particular the heading "Why am I getting an error converting a > Foo** → > >>> >> const Foo**?" in an official FAQ from the C Standards Committee > should make > >>> >> you realize this. > >>> >> > >>> >> /HH > >>> >> > >>> >> Den mån 24 nov. 2025 kl 18:45 skrev Александр Поваляев < > >>> >> [email protected]>: > >>> >> > >>> >>> The articles mentioned are all about coding practices ("safe" and > >>> >>> "unsafe"). They are not about bugs in compilers and hard > restrictions being > >>> >>> placed on where I can use "const" in my code and where I can't. :) > >>> >>> > >>> >>> The links mentioned earlier just give a recommendation to use > "Foo** -> > >>> >>> const Foo * const *" conversion instead of "Foo** -> const Foo**". > >>> >>> Literally, what I am saying is that: "if you can use const, you > should > >>> >>> use it". And this is the case which just confirms my attitude. > >>> >>> But again, this is about coding practices and recommendations. > There is > >>> >>> no place in C and C++ standards saying "DON"T USE CONST EVEN IF > YOU CAN DO > >>> >>> IT. WE'RE PROHIBITING THIS". > >>> >>> > >>> >>> And so, what GCC compiler (+ some SDKs) is doing now is just the > opposite > >>> >>> to the recommendation mentioned. It restricts the places where > "const" > >>> >>> might be used. > >>> >>> Anyway, it is a BUG (BIG BUG!!!) in the GCC + SDK. And the BUG was > not > >>> >>> made intentionally to protect software engineers from using > "unsafe coding > >>> >>> practices" :))))) > >>> >>> For such kind of practices, there are warnings with information > messages. > >>> >>> And the bug in GCC should be (1) reported; (2) nailed down and (3) > fixed. > >>> >>> > >>> >>> Respectfully, > >>> >>> Aleksandr G Povaliaev. > >>> >>> > >>> >>> > >>> >>> пн, 24 нояб. 2025 г. в 16:10, Henrik Holst < > [email protected] > >>> >>>> : > >>> >>>> > >>> >>>> Den mån 24 nov. 2025 kl 13:40 skrev Александр Поваляев < > >>> >>>> [email protected]>: > >>> >>>> > >>> >>>>> Hi there! > >>> >>>>> > >>> >>>>> "False sense of security". Const is a hint to any C compiler to > make > >>> >>>>> code more error-prone. So, it is always better to use as much > "const" as > >>> >>>>> possible. > >>> >>>>> My point is that "if const might be used, it SHOULD be used". > That is > >>> >>>>> the cornerstone. > >>> >>>>> I want to use it, so GCC compiler + SDK should make it possible. > It is > >>> >>>>> my code and my design decisions being undertaken. > >>> >>>>> > >>> >>>>> All discussions if it is possible to overcome or not "Const" > >>> >>>>> restriction is irrelivant here. > >>> >>>>> > >>> >>>> no it is not irrelevant here because if I declare a variable as > const in > >>> >>>> my local code the value should not be changed by other code > either, look at > >>> >>>> the code in the link given to you earlier which shows just such a > case as > >>> >>>> an example on why this is not allowed in C. > >>> >>>> > >>> >>>> /HH > >>> >>>> > >>> >>>>> Respectfully, > >>> >>>>> Aleksandr G Povaliaev. > >>> >>>>> > >>> >>>>> пн, 24 нояб. 2025 г. в 13:46, Henrik Holst < > >>> >>>>> [email protected]>: > >>> >>>>> > >>> >>>>>> The things is that this is unsafe and invalid due to it > creating a > >>> >>>>>> false sense of security. Aka your "const Foo *" can change > under your feet > >>> >>>>>> by _other_ code leading to your const here giving you a false > sense of > >>> >>>>>> security. Yes it prevents you from modifying it locally but not > some other > >>> >>>>>> code or thread from modifying your const pointer to now point > to something > >>> >>>>>> else, hence the compiler issues an error here since you do not > get what you > >>> >>>>>> think you are getting. > >>> >>>>>> > >>> >>>>>> /HH > >>> >>>>>> > >>> >>>>>> Den mån 24 nov. 2025 kl 11:10 skrev Александр Поваляев via > Gcc-help < > >>> >>>>>> [email protected]>: > >>> >>>>>> > >>> >>>>>>> Hi there! > >>> >>>>>>> > >>> >>>>>>> The code is not invalid and neither of the links posted saying > that > >>> >>>>>>> "const > >>> >>>>>>> Foo * const * const" is invalid construction for C. > >>> >>>>>>> The links posted just are discussing that it might be UNSAFE > to cast > >>> >>>>>>> "Foo > >>> >>>>>>> **" -> "const Foo **" and recommending usage of "Foo **" -> > "const > >>> >>>>>>> Foo * > >>> >>>>>>> const *" instead. > >>> >>>>>>> It's OK. If you feel that it is unsafe, please don't use it. > It is > >>> >>>>>>> your own > >>> >>>>>>> decision. > >>> >>>>>>> > >>> >>>>>>> But the syntax itself "const Foo * const * const" is correct > and the > >>> >>>>>>> use-case I mentioned is quite simple and evident. > >>> >>>>>>> And so I need this code snipped to be compiled transparently > over all > >>> >>>>>>> the > >>> >>>>>>> GCC (and platform SDKs) available versions. > >>> >>>>>>> > >>> >>>>>>> Respectfully, > >>> >>>>>>> Aleksandr G Povaliaev. > >>> >>>>>>> > >>> >>>>>>> > >>> >>>>>>> пн, 24 нояб. 2025 г. в 01:48, David Brown < > [email protected]>: > >>> >>>>>>> > >>> >>>>>>>> On 23/11/2025 21:45, Александр Поваляев via Gcc-help wrote: > >>> >>>>>>>>> Hi there! > >>> >>>>>>>>> > >>> >>>>>>>> This is getting /extremely/ frustrating. /Please/ find some > way to > >>> >>>>>>>> learn the C programming language - courses, books, good online > >>> >>>>>>> resources. > >>> >>>>>>>> And /please/ believe me when I say that people who have > worked with > >>> >>>>>>> C > >>> >>>>>>>> and C++ for decades, studied the standards, who serve on the > >>> >>>>>>> standards > >>> >>>>>>>> committee, know better about these things than you do. (I'm > talking > >>> >>>>>>>> about Jonathan here, not myself - he really is a world-class > expert > >>> >>>>>>> here.) > >>> >>>>>>>>> Either the links you've provided or the links you provided > earlier > >>> >>>>>>>>> (yesterday) are irrelevant, cause they are just discussing > if it > >>> >>>>>>> is safer > >>> >>>>>>>>> to convert "Foo_Type **" to "const Foo_Type **" or not. > >>> >>>>>>>>> > >>> >>>>>>>> The links are highly relevant. They explain why you cannot > convert > >>> >>>>>>> from > >>> >>>>>>>> "char **" to "const char **". That also explains why you > cannot > >>> >>>>>>> convert > >>> >>>>>>>> from "char **" to "const char * const * const". Adding even > more > >>> >>>>>>>> "const" qualifiers to the invalid conversion does not somehow > >>> >>>>>>> magically > >>> >>>>>>>> make it work. > >>> >>>>>>>> > >>> >>>>>>>>> Once again, we are not converting "char** to const char**", > we're > >>> >>>>>>>>> converting char** to const char * const * const". > >>> >>>>>>>>> And we're not discussing if it is safer or not, we are > discussing > >>> >>>>>>> GCC > >>> >>>>>>>>> compiler error. > >>> >>>>>>>>> > >>> >>>>>>>> The compiler is generating an error message because you wrote > >>> >>>>>>> invalid > >>> >>>>>>>> code. The error - or bug, if you like - is in /your/ code. > Not the > >>> >>>>>>>> compiler. GCC is doing its job correctly here. > >>> >>>>>>>> > >>> >>>>>>>>> Respectfully, > >>> >>>>>>>>> Aleksandr G Povaliaev. > >>> >>>>>>>>> > >>> >>>>>>>> I'm sorry, but signing the post with "respectfully" does not > make it > >>> >>>>>>>> respectful. You started the thread disrespectfully - > insisting that > >>> >>>>>>>> there is a bug in GCC when you simply do not understand the > relevant > >>> >>>>>>>> aspects of the C programming language. And you have gone > downhill > >>> >>>>>>> since > >>> >>>>>>>> then, ignoring and rejecting the help and advice you have been > >>> >>>>>>> given. > >>> >>>>>>>> Getting things wrong once is entirely understandable - this > is a > >>> >>>>>>> subtle > >>> >>>>>>>> point of the C language, and you are posting to a "help" list. > >>> >>>>>>> Doubling > >>> >>>>>>>> down on your ignorance when you have received the help and > >>> >>>>>>> information > >>> >>>>>>>> you need, is a different matter entirely. > >>> >>>>>>>> > >>> >>>>>>>> Your code is flawed. You need to fix it. Mindlessly > repeating your > >>> >>>>>>>> misunderstandings about how you think C works will not do > anything > >>> >>>>>>> but > >>> >>>>>>>> annoy people. > >>> >>>>>>>> > >>> >>>>>>>> David > >>> >>>>>>>> > >>> >>>>>>>> >