Compiling GCC With a C++ Compiler (g++)
Gabriel Dos Reis
gdr@cs.tamu.edu
Wed Oct 13 21:45:00 GMT 2004
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.
?
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;
}
-- Gaby
More information about the Gcc
mailing list