Compiling GCC With a C++ Compiler (g++)
Geoffrey Keating
geoffk@apple.com
Wed Oct 13 22:15:00 GMT 2004
On 13/10/2004, at 1:39 PM, Gabriel Dos Reis wrote:
> Geoffrey Keating <geoffk@apple.com> writes:
>
> | On 12/10/2004, at 8:42 PM, Gabriel Dos Reis wrote:
> |
> | > The code in build_string
> | >
> | > memset (s, 0, sizeof (struct tree_common));
> | > TREE_SET_CODE (s, STRING_CST);
> | > TREE_STRING_LENGTH (s) = len;
> | > memcpy ((char *) TREE_STRING_POINTER (s), str, len);
> | > ((char *) TREE_STRING_POINTER (s))[len] = '\0';
> | >
> | > is trying to do similar thing, but it is undefined behaviour.
> | >
> | > [#5] If an attempt is made to modify an object defined with
> | > a const-qualified type through use of an lvalue with non-
> | > const-qualified type, the behavior is undefined.
> |
> | The object here is '*s', which was not defined with a const-qualified
> | type. It's not defined with any type at all, it was allocated
> through
> | malloc which is not a typed interface. (It would be different if it
> | was allocated through 'new', but we do not have new in C.)
>
> The undefined behaviour comes from different sources.
> Consider the following:
>
> typedef struct {
> int fu;
> const int bhar;
> } S;
>
> void f(S *p)
> {
> (*p).fu = 90; // #1
> }
>
> Do you believe line #1 is valid in face of
>
> [#1] An lvalue is an expression with an object type or an
> incomplete type other than void;53) if an lvalue does not
> designate an object when it is evaluated, the behavior is
> undefined. When an object is said to have a particular
> type, the type is specified by the lvalue used to designate
> the object. A modifiable lvalue is an lvalue that does not
> have array type, does not have an incomplete type, does not
> have a const-qualified type, and if it is a structure or
> union, does not have any member (including, recursively, any
> member or element of all contained aggregates or unions)
> with a const-qualified type.
>
> ?
Yes. The lvalue here is '(*p).fu', which has type 'int' and therefore
is a modifiable lvalue.
Note that '*p' is not a modifiable lvalue, but all of '*p' is not being
modified here.
> Notice that here, it is not a question of where the object pointed to
> by *p comes from.
>
> Next question is for
>
> void g(S *p)
> {
> p->fu = 90;
> }
Yes. Same reasoning.
--
Geoff Keating <geoffk@apple.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2361 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc/attachments/20041013/d933b790/attachment.p7s>
More information about the Gcc
mailing list