Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #148303
| From | Ben Bacarisse <ben.usenet@bsb.me.uk> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: sizeof object got by dereferencing uniniitalized pointer |
| Date | 2019-11-29 22:00 +0000 |
| Organization | A noiseless patient Spider |
| Message-ID | <87pnha2vhx.fsf@bsb.me.uk> (permalink) |
| References | (6 earlier) <43093894-ed52-47de-85f4-eadd92a1499e@googlegroups.com> <877e3j52do.fsf@bsb.me.uk> <86eexr8qlh.fsf@linuxsc.com> <87v9r33211.fsf@bsb.me.uk> <86k17i7kuh.fsf@linuxsc.com> |
Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
> Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
>
>> Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
>>
>>> Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
>>>
>>>> Thiago Adams <thiago.adams@gmail.com> writes:
>>>> <cut>
>>>>
>>>>> Only when applied to variably types, sizeof is in runtime.
>>>>>
>>>>> int n = 10;
>>>>>
>>>>> int(*buf)[n] = malloc(sizeof(int) * n);
>>>>
>>>> Why would you not write
>>>>
>>>> int (*buf)[n] = malloc(sizof *buf);
>>>>
>>>> ?
>>>
>>> Perhaps because, technically speaking, the right-hand side here
>>> has undefined behavior?
>>
>> Yes, it has. That has always puzzled me. Do you think that this usage
>> was specifically being ruled out, or is it a casualty of having made an
>> overly simple decision[1]?
>
> I have now looked into this further and can offer a more informed
> answer. More below.
>
>> This whole areas makes me uneasy. I've never been able to find a
>> reasonable example where an expression operand of sizeof needs to be
>> evaluated[2] (as the standard mandates) but most compilers evaluate f in
>>
>> sizeof (int[f()])
>>
>> despite the standard not explaining what it means to evaluate a type
>> (though its not hard to guess what is intended). Do the rules make
>> sense to you? [I note your comment about _Generic_ but taking
>> it out because it doesn't bear on what I have to say.]
>
> The rules now make sense to me. The authors wanted to be sure (or
> so I believe, in case that needs saying) that they didn't miss any
> corner cases, and so used general wording.
I didn't say what I meant, sorry. I wanted to ask if you think the
rules are the right ones. I feel the sacrifice (to undefined behaviour)
of patterns like
memset(ptr, 0, sizeof *ptr);
to be unfortunate. Mind you, VLAs, and the even more useful variably
modified types, have been thrown under the bus anyway.
> They did think about
> needless evaluation in 'sizeof' operands, and the Standard does
> have a provision which talks about that; in fact that provision
> evolved while C99 was being written.
I would have argued for a limited form of evaluation -- evaluation
sufficient to determine the type. I think the rules would not be too
complicated, and it would be the natural place to specify what
"evaluating" a type name means.
> (If anyone cares they might
> want to compare n869 to later versions of the C99 standard.)
>
> Now, I hear you ask, _what_ corner cases? Here is one, taken from
> my recent reponse to Keith Thompson:
>
> int foo = sizeof *(int (*)[ ident( 1 ) ]){ &something };
>
> This declaration is legal C99, provided of course there are
> suitable declarations for the identifiers 'something' and 'ident'
> in scope. The operand is an expression, not a type name, although
> of course the expression does have a type name within it. The
> operand expression needs to be evaluated, at least in part, in
> order to determine the result of the sizeof operator.
The same effect can be achieved without a compound literal by using a
cast. Is there a subtle point I'm missing that relies on the CL?
> Rather than
> concoct some carefully chosen language that does some sort of
> partial evalution for just those subexpressions that are needed
> to produce the result, the authors chose the simple rule that
> any VLA operand argument is evaluated. That decision has some
> unfortunate consequences for undefined behavior, but in the 1990s
> there wasn't as much hysteria regarding undefined behavior as
> there is now.
Maybe " evaluation sufficient to determine the type" is more complicated
than I imagine. I wonder if it was every considered.
> So for better or worse there is my somewhat-more-informed current
> view of the matter.
--
Ben.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
sizeof object got by dereferencing uniniitalized pointer "V.Subramanian, India" <subramanian100in@yahoo.com> - 2019-11-28 05:20 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-28 05:37 -0800
Re: sizeof object got by dereferencing uniniitalized pointer mark.bluemel@gmail.com - 2019-11-28 05:59 -0800
Re: sizeof object got by dereferencing uniniitalized pointer David Brown <david.brown@hesbynett.no> - 2019-11-28 15:51 +0100
Re: sizeof object got by dereferencing uniniitalized pointer Malcolm McLean <malcolm.arthur.mclean@gmail.com> - 2019-11-28 07:27 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Herbert Rosenau <nospam@hrosenau.de> - 2019-11-28 17:28 +0100
Re: sizeof object got by dereferencing uniniitalized pointer Thiago Adams <thiago.adams@gmail.com> - 2019-11-28 08:51 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-28 17:36 +0000
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-28 16:37 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-29 01:27 +0000
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-28 17:47 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-28 21:16 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Keith Thompson <kst-u@mib.org> - 2019-11-29 00:38 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-29 09:03 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Keith Thompson <kst-u@mib.org> - 2019-11-29 13:15 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Keith Thompson <kst-u@mib.org> - 2019-11-29 13:38 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-29 07:09 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-29 06:10 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-29 11:12 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-12-01 09:32 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-29 07:39 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-29 22:00 +0000
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-29 22:40 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-30 11:19 +0000
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-30 09:01 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-12-01 10:28 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-28 12:49 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Thiago Adams <thiago.adams@gmail.com> - 2019-11-28 11:26 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Richard Damon <Richard@Damon-Family.org> - 2019-11-28 17:19 -0500
Re: sizeof object got by dereferencing uniniitalized pointer Tim Rentsch <tr.17687@z991.linuxsc.com> - 2019-11-28 17:26 -0800
Re: sizeof object got by dereferencing uniniitalized pointer Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-28 22:34 +0000
Re: sizeof object got by dereferencing uniniitalized pointer Ben Bacarisse <ben.usenet@bsb.me.uk> - 2019-11-28 17:34 +0000
You gotta wonder why people say things like this! (Was: sizeof object got by dereferencing uniniitalized pointer) gazelle@shell.xmission.com (Kenny McCormack) - 2019-11-28 17:19 +0000
Re: sizeof object got by dereferencing uniniitalized pointer Keith Thompson <kst-u@mib.org> - 2019-11-28 14:55 -0800
Re: sizeof object got by dereferencing uniniitalized pointer "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2019-11-30 15:28 -0800
csiph-web