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