This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
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; }
-- Geoff Keating <geoffk@apple.com>
Attachment:
smime.p7s
Description: S/MIME cryptographic signature
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |