Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: David Brown Newsgroups: comp.lang.c Subject: Re: No warning at implicit removal of const. Was: relearning C: why does an in-place change to a char* segfault? Date: Tue, 13 Aug 2024 13:08:57 +0200 Organization: A noiseless patient Spider Lines: 73 Message-ID: References: <20240801174026.00002cda@yahoo.com> <87zfpvfdk4.fsf@nosuchdomain.example.com> <86ttfp2zpf.fsf@linuxsc.com> <871q2tiffa.fsf@nosuchdomain.example.com> <86jzgl1gw6.fsf@linuxsc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Tue, 13 Aug 2024 13:08:57 +0200 (CEST) Injection-Info: dont-email.me; posting-host="c1a1041a93166a8aacca8d5e30b6a3ee"; logging-data="4060551"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX194LNwqjKDuWfkZOCq6h5mz/DvJ2RUDc9I=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Cancel-Lock: sha1:kngDuHeuQeO1U5EbJRcS3tcW9QI= Content-Language: en-GB In-Reply-To: <86jzgl1gw6.fsf@linuxsc.com> Bytes: 4138 On 13/08/2024 01:05, Tim Rentsch wrote: > Keith Thompson writes: > >> Tim Rentsch writes: >> >>> Keith Thompson writes: >>> >>>> candycanearter07 >>>> writes: >>>> >>>>> David Brown wrote at 17:56 this Thursday (GMT): >>>> >>>> [...] >>>> >>>>>> gcc has the option "-Wwrite-strings" that makes string literals in >>>>>> C have "const char" array type, and thus give errors when you try >>>>>> to assign to a non-const char * pointer. But the option has to be >>>>>> specified explicitly (it is not in -Wall) because it changes the >>>>>> meaning of the code and can cause compatibility issues with >>>>>> existing correct code. >>>>> >>>>> -Wwrite-strings is included in -Wpedantic. >>>> >>>> No it isn't, nor is it included in -Wall -- and it wouldn't make >>>> sense to do so. >>>> >>>> The -Wpedantic option is intended to produce all required >>>> diagnostics for the specified C standard. -Wwrite-strings >>>> gives string literals the type `const char[LENGTH]`, which >>>> enables useful diagnostics but is *non-conforming*. >>> >>> As long as the -Wwrite-strings diagnostics are only warnings the >>> result is still conforming. >> >> It's not just about diagnostics. This program: >> >> #include >> int main(void) { >> puts(_Generic("hello", >> char*: "char*", >> const char*: "const char*", >> default: "?")); >> } >> >> must print "char*" in a conforming implementation. With >> (gcc|clang) -Wwrite-strings, it prints "const char*". > > Good point. I hadn't considered such cases. > >> And something as simple as: >> >> char *p = "hello"; >> >> is rejected with a fatal error with "-Wwrite-strings -pedantic-errors". > > That violates the "As long as the -Wwrite-strings diagnostics are > only warnings" condition. Indeed. I personally think it is nice to have an option to make string literals "const" in C, even though it is non-conforming. I also think it is very useful to have a warning on attempts to write to string literals. But I think gcc has made a mistake here by conflating the two. I'd rather see the warning being enabled by default (or at least in -Wall), while the "make string literals const" option should require an explicit flag and be a "-f" flag rather than a "-W" flag. The current situation seems to be a quick-and-dirty way to get the warning. Other people may have different opinions, of course :-)