Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #153096

Re: Mark Twain had something to say about this...

From Keith Thompson <Keith.S.Thompson+u@gmail.com>
Newsgroups comp.lang.c
Subject Re: Mark Twain had something to say about this...
Date 2020-07-06 23:22 -0700
Organization None to speak of
Message-ID <877dvfc09m.fsf@nosuchdomain.example.com> (permalink)
References <rdv1l5$clo$1@reader1.panix.com> <rdv1vh$idl$1@dont-email.me> <rdv6jl$s42$1@news.xmission.com> <OVQMG.37345$bQ4.20458@fx04.iad>

Show all headers | View raw


Richard Damon <Richard@Damon-Family.org> writes:
> On 7/6/20 8:48 AM, Kenny McCormack wrote:
>> In article <rdv1vh$idl$1@dont-email.me>,
>> jacobnavia  <jacob@jacob.remcomp.fr> wrote:
>> ...
>>> That line modifies a read only string. Strings are const and shuldn't be 
>>> modified. Some compilers do enforce that, others like lcc-wi, allow you 
>>> to do that but it is in general a very bad idea.
>> 
>> 1) I might go along with "a bad idea", but, seriously, "a VERY bad idea" ?
>>     Why so extreme?
>> 
>> 2) If lcc-win (your product) allows it, surely it can't really be "a VERY
>>     bad idea", now can it?
>
> Back in the days of K&R, many computers didn't have protection methods
> to make string read only, so writing into the 'constant' string would
> 'work'. It was never defined to work as a promise (if you wanted that
> you could declare a char array that you initialized, and that would be
> for sure writable). Also, compilers were dumb enough, that generally
> they wouldn't try to combine compatible strings.
>
> As things evolved, more machines had protection ability, and made it so
> that you couldn't overwrite the data, and others didn't make this change.
>
> When the C89/C90 Standard came out, it was decided that string literals
> would be formally defined as being constant, and attempting to change
> them would invoke undefined behavior. While the standard also added the
> const key word, that could have been used as the type of these strings,
> that would break way too many programs, that didn't write into these
> strings, but were written in prior versions of C that didn't have this
> new keyword, so strings became constant, but not const. This also
> allowed some implementations to continue to support the ability to
> overwrite into string literals as a compatible extension (the results of
> undefined behavior might be what you want).

Agreed.  For example, this program:
    #include <stdio.h>
    int main(void) {
        char *s = "hello";
        puts(s);
    }
is portable and conforming.  Changing "char *s" to "const char *s" would
be better style, though.

A bit of a terminology quibble: string literals are not "constant" in
the way the standard uses that term.  In the C standard a "constant" is
a lexical token representing a scalar value (such as 42 or 1.23), and a
"constant expression" is an expression that must be evaluable at compile
time.  A string literal is neither.

C doesn't say that string literals are constant.  It says that
attempting to modify a string literal has undefined behavior.  (And by
"modify a string literal", I mean "modify the char array associated with
the string literal", an anonymous array with static storage duration).

> Writing into a string constant is a VERY bad idea, UNLESS, you program
> specifically requires the use of an extension that allows it, and you
> make sure that you only use those implementations that provide it.

And even then the behavior can vary.

Consider this program:

#include <stdio.h>
int main(void) {
    char *s0 = "hello";
    char *s1 = "hello";
    s0[0] = 'H';
    puts(s0);
    puts(s1);
    return 0;
}

gcc, clang, and icc all store string literals in read-only memory (not
physical ROM unless you're targeting an embedded system, but memory that
the OS won't allow your application to modify).  As a result, the
program dies with a segmentation fault on `s0[0] = 'H'`.  (At least it
does so on my system, an x86_64 running Ubuntu.)

tcc apparently stores string literals in read/write memory (and doesn't
seem to have an option to change that).  The program's output is:
    Hello
    hello

lcc-win (Windows only) apparently also stores string literals in
read/write memory *and* it performs an optimization so that identical
string literals are stored only once.  The assignment modifies that
single stored value, so the output is
    Hello
    Hello

All three behaviors are conforming.  Nasal demons would also be
conforming.  (I personally prefer the way gcc does it.)

-- 
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
Working, but not speaking, for Philips Healthcare
void Void(void) { Void(); } /* The recursive call of the void */

Back to comp.lang.c | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-06 11:24 +0000
  Re: does char *str="abcd"; alloc addressable memory? jacobnavia <jacob@jacob.remcomp.fr> - 2020-07-06 13:29 +0200
    Mark Twain had something to say about this... (Was: does char *str="abcd"; alloc addressable memory?) gazelle@shell.xmission.com (Kenny McCormack) - 2020-07-06 12:48 +0000
      Re: Mark Twain had something to say about this... (Was: does char *str="abcd"; alloc addressable memory?) BGB <cr88192@gmail.com> - 2020-07-06 11:55 -0500
        Re: Mark Twain had something to say about this... (Was: does char *str="abcd"; alloc addressable memory?) Vir Campestris <vir.campestris@invalid.invalid> - 2020-07-06 21:21 +0100
          Re: Mark Twain had something to say about this... John Forkosh <forkosh@panix.com> - 2020-07-07 03:21 +0000
          Re: Mark Twain had something to say about this... (Was: does char *str="abcd"; alloc addressable memory?) mark.bluemel@gmail.com - 2020-07-09 06:30 -0700
      Re: Mark Twain had something to say about this... (Was: does char *str="abcd"; alloc addressable memory?) Richard Damon <Richard@Damon-Family.org> - 2020-07-06 22:16 -0400
        Re: Mark Twain had something to say about this... Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-06 23:22 -0700
      Re: Mark Twain had something to say about this... John Forkosh <forkosh@panix.com> - 2020-07-07 02:46 +0000
      Re: Mark Twain had something to say about this... (Was: does char *str="abcd"; alloc addressable memory?) jacobnavia <jacob@jacob.remcomp.fr> - 2020-07-07 09:29 +0200
    Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-06 11:25 -0700
      Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-07 03:05 +0000
        Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-06 23:25 -0700
          Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-07 06:47 +0000
            Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-07 07:00 +0000
              Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-07 01:24 -0700
              Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-07 20:47 +0100
                Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-08 03:43 +0000
        Re: does char *str="abcd"; alloc addressable memory? David Brown <david.brown@hesbynett.no> - 2020-07-07 09:35 +0200
          Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-07 07:54 +0000
            Re: does char *str="abcd"; alloc addressable memory? David Brown <david.brown@hesbynett.no> - 2020-07-07 11:27 +0200
          Re: does char *str="abcd"; alloc addressable memory? Richard Damon <Richard@Damon-Family.org> - 2020-07-09 06:53 -0400
            Re: does char *str="abcd"; alloc addressable memory? David Brown <david.brown@hesbynett.no> - 2020-07-09 14:48 +0200
              Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-09 17:01 +0100
                Re: does char *str="abcd"; alloc addressable memory? David Brown <david.brown@hesbynett.no> - 2020-07-09 22:10 +0200
                Re: does char *str="abcd"; alloc addressable memory? scott@slp53.sl.home (Scott Lurndal) - 2020-07-09 20:23 +0000
                Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-09 23:56 +0100
                Re: does char *str="abcd"; alloc addressable memory? antispam@math.uni.wroc.pl - 2020-07-10 03:25 +0000
                Re: does char *str="abcd"; alloc addressable memory? Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2020-07-10 11:56 -0400
                Re: does char *str="abcd"; alloc addressable memory? richard@cogsci.ed.ac.uk (Richard Tobin) - 2020-07-10 12:31 +0000
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-09 13:35 -0700
                Re: does char *str="abcd"; alloc addressable memory? scott@slp53.sl.home (Scott Lurndal) - 2020-07-09 22:17 +0000
                Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-09 23:50 +0100
            Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-09 16:52 +0100
            Re: does char *str="abcd"; alloc addressable memory? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2020-07-09 10:13 -0700
              Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-09 11:24 -0700
                Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-09 22:59 +0000
                Re: does char *str="abcd"; alloc addressable memory? Manfred <noname@add.invalid> - 2020-07-10 16:36 +0200
                Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-10 15:54 +0100
                Re: does char *str="abcd"; alloc addressable memory? Manfred <noname@add.invalid> - 2020-07-10 18:33 +0200
                Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-10 22:50 +0100
                Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-11 16:21 +0100
                Re: does char *str="abcd"; alloc addressable memory? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2020-07-11 08:55 -0700
                Re: does char *str="abcd"; alloc addressable memory? Bart <bc@freeuk.com> - 2020-07-11 17:09 +0100
                Re: does char *str="abcd"; alloc addressable memory? Manfred <noname@add.invalid> - 2020-07-11 18:34 +0200
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-10 13:17 -0700
                Re: does char *str="abcd"; alloc addressable memory? Manfred <noname@add.invalid> - 2020-07-11 02:00 +0200
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-10 17:46 -0700
                Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-11 03:09 +0000
                Re: does char *str="abcd"; alloc addressable memory? Manfred <noname@add.invalid> - 2020-07-11 18:43 +0200
                Re: does char *str="abcd"; alloc addressable memory? James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-07-11 15:09 -0400
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-11 13:39 -0700
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-11 15:50 -0700
                Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-12 01:06 +0000
                Re: does char *str="abcd"; alloc addressable memory? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2020-07-10 08:54 -0700
                Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-11 03:26 +0000
                Re: does char *str="abcd"; alloc addressable memory? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2020-07-11 03:56 -0700
                Re: does char *str="abcd"; alloc addressable memory? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2020-07-10 08:46 -0700
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-10 13:38 -0700
                Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-10 13:54 -0700
        Re: does char *str="abcd"; alloc addressable memory? James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-07-07 08:52 -0400
    Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-07 02:56 +0000
      Re: does char *str="abcd"; alloc addressable memory? antispam@math.uni.wroc.pl - 2020-07-07 19:08 +0000
        Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-08 04:07 +0000
          Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-07 21:54 -0700
  Re: does char *str="abcd"; alloc addressable memory? Ike Naar <ike@sdf.org> - 2020-07-06 11:56 +0000
  Re: does char *str="abcd"; alloc addressable memory? Bonita Montero <Bonita.Montero@gmail.com> - 2020-07-06 13:57 +0200
    Re: does char *str="abcd"; alloc addressable memory? Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2020-07-06 05:37 -0700
      Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-06 19:52 +0100
        Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-06 12:20 -0700
      Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-07 03:32 +0000
        Re: does char *str="abcd"; alloc addressable memory? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2020-07-07 06:26 -0700
          Re: does char *str="abcd"; alloc addressable memory? Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2020-07-07 10:03 -0700
            Re: does char *str="abcd"; alloc addressable memory? Tim Rentsch <tr.17687@z991.linuxsc.com> - 2020-07-09 10:07 -0700
          Re: does char *str="abcd"; alloc addressable memory? John Forkosh <forkosh@panix.com> - 2020-07-08 03:57 +0000
            Re: does char *str="abcd"; alloc addressable memory? James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-07-08 11:02 -0400
    Re: does char *str="abcd"; alloc addressable memory? James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-07-06 09:43 -0700
      Re: does char *str="abcd"; alloc addressable memory? Ben Bacarisse <ben.usenet@bsb.me.uk> - 2020-07-06 19:35 +0100
    Re: does char *str="abcd"; alloc addressable memory? Andrey Tarasevich <andreytarasevich@hotmail.com> - 2020-07-06 18:50 -0700
  Re: does char *str="abcd"; alloc addressable memory? James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-07-06 08:35 -0400
    Re: does char *str="abcd"; alloc addressable memory? James Kuyper <jameskuyper@alumni.caltech.edu> - 2020-07-06 11:21 -0400
  Re: does char *str="abcd"; alloc addressable memory? Barry Schwarz <schwarzb@delq.com> - 2020-07-06 09:58 -0700
    Re: does char *str="abcd"; alloc addressable memory? scott@slp53.sl.home (Scott Lurndal) - 2020-07-06 23:07 +0000
      Re: does char *str="abcd"; alloc addressable memory? Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2020-07-06 20:03 -0400
        Re: does char *str="abcd"; alloc addressable memory? scott@slp53.sl.home (Scott Lurndal) - 2020-07-07 14:36 +0000
          Re: does char *str="abcd"; alloc addressable memory? Lew Pitcher <lew.pitcher@digitalfreehold.ca> - 2020-07-07 11:58 -0400

csiph-web