Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c > #148331
| From | Tim Rentsch <tr.17687@z991.linuxsc.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: sizeof object got by dereferencing uniniitalized pointer |
| Date | 2019-12-01 10:28 -0800 |
| Organization | A noiseless patient Spider |
| Message-ID | <86y2vv6guh.fsf@linuxsc.com> (permalink) |
| References | (7 earlier) <877e3j52do.fsf@bsb.me.uk> <86eexr8qlh.fsf@linuxsc.com> <87v9r33211.fsf@bsb.me.uk> <86k17i7kuh.fsf@linuxsc.com> <87pnha2vhx.fsf@bsb.me.uk> |
Ben Bacarisse <ben.usenet@bsb.me.uk> writes:
> 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.
If what you're asking is, do I think it would be an improvement
to have a different rule that allows more of the typical cases to
be evaluation free and so avoid any possibility of undefined
behavior, the answer is Yes.
>> 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.
I think I would propose a different approach, namely, a rule that
is both easy to state and easy to test without any deep thinking,
and that covers the usual patterns without any possibility of
undefined behavior. Without thinking about it too deeply, I might
suggest that operands of sizeof are not evaluated unless the type
is a variable length array type and the operand expression has at
least one 'type-name' in it that declares a variably modified type
(perhaps with a footnote that says variable length array types
may involve some run-time computation to produce the value but
the expression is not evaluated in the usual C sense unless it
satisfies the aforementioned 'type-name' criterion).[*] If this
works I think it would be a reasonable candidate, especially if
I had a time machine so I could go back and get it into C99, and
similarly go back and manage to get VLAs out from under the bus
where they were so unceremoniously thrown.
[*] Ideally with much better phrasing than that abomination of a
sentence.
>> (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?
Not that I know of, I think casts work fine too for this purpose.
Using a compound literal is just the first example that popped
into my head.
>> 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.
I think the main thing is this formulation is more complicated
than it needs to be. Also it seems prone to interpretation
arguments, much like the infamous pre-C11 "the prior value shall
be read only to determine the value to be stored." Even if that
is unambiguous, it isn't always obvious what is implied. Here I
think having the boundaries be immediately evident is a decidely
worthwhile property.
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