On 08/22/2018 11:40 PM, Bernd Edlinger wrote:
> On 08/23/18 01:36, Jeff Law wrote:
>> On 08/22/2018 05:22 PM, Bernd Edlinger wrote:
>>> On 08/23/18 00:50, Jeff Law wrote:
>>>> On 08/22/2018 02:14 AM, Richard Biener wrote:
>>>>> On Wed, 22 Aug 2018, Bernd Edlinger wrote:
>>>>>
>>>>>> On 08/22/18 09:26, Richard Biener wrote:
>>>>>>> On Wed, 22 Aug 2018, Bernd Edlinger wrote:
>>>>>>>
>>>>>>>> On 08/21/18 10:59, Richard Biener wrote:
>>>>>>>>> On Tue, 21 Aug 2018, Bernd Edlinger wrote:
>>>>>>>>>
>>>>>>>>>> gcc -S -O2 -Wall -Wformat-overflow -ftrack-macro-expansion=0 
>>>>>>>>>> -fshort-wchar builtin-sprintf-warn-20.c
>>>>>>>>>> builtin-sprintf-warn-20.c: In function 'test':
>>>>>>>>>> builtin-sprintf-warn-20.c:19:39: warning: hex escape sequence out of 
>>>>>>>>>> range
>>>>>>>>>> 19 |     ? (char*)L"\x4142\x4344" : (char*)L"\x41424344\x45464748";
>>>>>>>>>>         |                                       
>>>>>>>>>> ^~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>
>>>>>>>>>> Hmm, this test might create some noise on short-wchar targets.
>>>>>>>>>>
>>>>>>>>>> I would prefer a warning here, about the wrong type of the parameter.
>>>>>>>>>> The buffer overflow is only a secondary thing.
>>>>>>>>>>
>>>>>>>>>> For constant objects like those, the GIMPLE type is still guaranteed 
>>>>>>>>>> to be reliable,
>>>>>>>>>> right?
>>>>>>>>>
>>>>>>>>> TREE_TYPE of tcc_declaration and tcc_constant trees should 
>>>>>>>>> more-or-less
>>>>>>>>> (minus qualifications not affecting semantics) be those set by
>>>>>>>>> frontends.
>>>>>>>>>
>>>>>>>>
>>>>>>>> and in this case:
>>>>>>>>
>>>>>>>> const union
>>>>>>>> { struct {
>>>>>>>>         wchar_t x[4];
>>>>>>>>       };
>>>>>>>>       struct {
>>>>>>>>         char z[8];
>>>>>>>>       };
>>>>>>>> } u = {{L"123"}};
>>>>>>>>
>>>>>>>> int test()
>>>>>>>> {
>>>>>>>>       return __builtin_strlen(u.z);
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> string_constant works out the initializer for u.x
>>>>>>>> which has a different type than u.z
>>>>>>>
>>>>>>> Yes.  That's because it uses ctor-for-folding and friends.  It's
>>>>>>> a question of the desired semantics of string_constant whether
>>>>>>> it should better return NULL_TREE in this case or whether the
>>>>>>> caller has to deal with type mismatches.
>>>>>>>
>>>>>>
>>>>>> Yes, absolutely.
>>>>>>
>>>>>> c_getstr needs to bail out if the string is not zero-terminated
>>>>>> within the limits given by the decl, or the string_cst-type or whatever
>>>>>> may help.
>>>>>>
>>>>>> Furthermore I also consider it possible that the byteoffset
>>>>>> is not a multiple of eltsize.  So fail in that case as well.
>>>>>>
>>>>>>
>>>>>> I am currently boot-strapping a patch for this (pr87053):
>>>>>> $ cat u.c
>>>>>> const union
>>>>>> { struct {
>>>>>>        char x[4];
>>>>>>        char y[4];
>>>>>>      };
>>>>>>      struct {
>>>>>>        char z[8];
>>>>>>      };
>>>>>> } u = {{"1234", "567"}};
>>>>>>
>>>>>> int test()
>>>>>> {
>>>>>>      return __builtin_strlen(u.z);
>>>>>> }
>>>>>>
>>>>>> gets folded to 4.
>>>>>>
>>>>>> ... but unfortunately it will depend on my pr86714 fix which fixes
>>>>>> the mem_size parameter returned from string_constant.
>>>>>>
>>>>>> Frankly, in the moment I feel like I fell in a deep deep hole.   :-O
>>>>>
>>>>> /me too with > 100 mails in this and related threads unread ;)
>>>>>
>>>>> I thought Jeff applied the mem_size parameter thing but maybe it
>>>>> was something else.  *fetches coffee*  Ah, Jeff is still "working"
>>>>> on it.
>>>> The patch that was applied adds a parameter to c_strlen to indicate how
>>>> it should count (ie, bytes, 16bit wchars or 32bit wchars).
>>>>
>>>> There was one hunk that was dependent upon an earlier, more
>>>> controversial, patch from Bernd which is still under discussion.  That
>>>> hunk was twiddled to preserve the overall goal of Bernd's patch which
>>>> added the how to count parameter without being dependent upon the older,
>>>> more controversial patch.
>>>>
>>>
>>> Which patch do you mean?
>> This one:
>>
>> Author: law <law@138bc75d-0d04-0410-961f-82ee72b054a4>
>> Date:   Thu Aug 16 22:38:04 2018 +0000
>>
>>              * builtins.c (c_strlen): Add new parameter eltsize.  Use it
>>              for determining how to count the elements.
>>              * builtins.h (c_strlen): Adjust prototype.
>>              * expr.c (string_constant): Add new parameter mem_size.
>>              Set *mem_size appropriately.
>>              * expr.h (string_constant): Adjust protoype.
>>              * gimple-fold.c (get_range_strlen): Add new parameter eltsize.
>>              * gimple-fold.h (get_range_strlen): Adjust prototype.
>>              * gimple-ssa-sprintf.c (get_string_length): Add new
>> parameter eltsize.
>>              (format_string): Call get_string_length with eltsize.
>>
>>      git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@263607
>> 138bc75d-0d04-0410-961f-82ee72b054a4
>>
> 
> Yes, and which one was the earlier, more controversial patch from me?

https://gcc.gnu.org/ml/gcc-patches/2018-07/msg01800.html


Which is the issue I'm working through right now :-)

jeff

Reply via email to