This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH] Make GO string literals properly NUL terminated
On Wed, Aug 1, 2018 at 3:05 PM Bernd Edlinger <firstname.lastname@example.org> wrote:
> On 08/01/18 11:29, Richard Biener wrote:
> > Hmm. I think it would be nice if TREE_STRING_LENGTH would
> > match char and TYPE_SIZE_UNIT even if that is inconvenient
> > for your check above. Because the '\0' doesn't belong to the
> > string. Then build_string internally appends a '\0' outside
> > of TREE_STRING_LENGTH.
> Hmm. Yes, but the outside-0 byte is just one byte, not a wide
That could be fixed though (a wide 0 is just N 0s). Add a elsz = 1
parameter to build_string and allocate as many extra 0s as needed.
There are STRING_CSTs which are not string literals,
> for instance attribute tags, Pragmas, asm constrants, etc.
> They use the '\0' outside, and have probably no TREE_TYPE.
> >> So I would like to be able to assume that the STRING_CST objects
> >> are internally always generated properly by the front end.
> > Yeah, I guess we need to define what "properly" is ;)
> >> And that the ARRAY_TYPE of the string literal either has the
> >> same length than the TREE_STRING_LENGTH or if it is shorter,
> >> this is always exactly one (wide) character size less than TREE_STRING_LENGTH
> > I think it should be always the same...
> One could not differentiate between "\0" without zero-termination
> and "" with zero-termination, theoretically.
Is that important? Doesn't the C standard say how to parse string literals?
> We also have char x = "ab";
> that is TREE_STRING_LENGTH=3, and TYPE_SIZE_UNIT(TREE_TYPE(x)) = 100.
> Of course one could create it with a TREE_STRING_LENGTH = 100,
> but imagine char x = "ab"
The question is more about TYPE_SIZE_UNIT (TREE_TYPE ("ab")) which I
hope matches "ab" and not 'x'. If it matches 'x' then I'd rather have it
unconditionally be , thus incomplete (because the literals "size" depends
on the context/LHS it is used on).
> >> The idea is to use this property of string literals where needed,
> >> and check rigorously in varasm.c.
> >> Does that make sense?
> > So if it is not the same then the excess character needs to be
> > a (wide) NUL in your model? ISTR your varasm.c patch didn't verify
> > that.
> I think it does.