From: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
To: Christopher Li <sparse@chrisli.org>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>,
Linux-Sparse <linux-sparse@vger.kernel.org>
Subject: Re: [PATCH v2] Avoid reusing string buffer when doing string expansion
Date: Thu, 5 Feb 2015 00:38:03 +0100 [thread overview]
Message-ID: <20150204233802.GA2275@macpro.local> (raw)
In-Reply-To: <CANeU7Q=xw-Hq7Nd+UOGb-EUbQSovzwpx1Zm4pP9XGnS4eaGb2A@mail.gmail.com>
On Wed, Feb 04, 2015 at 12:01:39AM -0800, Christopher Li wrote:
> On Tue, Feb 3, 2015 at 10:22 PM, Luc Van Oostenryck
> <luc.vanoostenryck@gmail.com> wrote:
> >> Are you sure about this behavior? You mean you see "b" has the string
> >> size as 2. I haven't understand how this can happen.
> >
> >
> > But if the macro is used several times:
> > ===
> > #define BACKSLASH "\\"
> > const char a[] = BACKSLASH;
> > const char b[] = BACKSLASH;
> > const char c[] = "<" BACKSLASH ">";
> > ===
> >
> > the, we get:
> > ===
> > symbol a:
> > char const [addressable] [toplevel] a[0]
> > bit_size = 16
> > val = "\0"
> > symbol b:
> > char const [addressable] [toplevel] b[0]
> > bit_size = 16
>
> The value buffer is corrupted. But the bit_size is still 16, which
> is correct. I just think that in your example it shouldn't corrupt
> the size. Your test case seems confirm that.
>
> > Is it only with macros that the string structure is so shared?
>
> That is right. I haven't see it can happen any other way.
> The tokenizer always construct new token and string structure
> from the C source file.
>
> It is the preprocessor using macro expand which copy and duplicate
> the token list. The token has a pointer point to the string which
> is shared across different invocation of macro.
Fine.
I was affraid that there was other possibilities, like, for exemple,
if the identical string litterals are put in an hash table, like it is done
for identifiers.
> > And have we a way to test if the string is coming from a macro?
>
> Not right now. But we can add it.
>
> >
> > A simpler and safer way would be to directly do the string expansion just after
> > a string token is recognized, or even better in the lexer itself.
> > So the string buffer, macro or not, will always directly contain the right values.
> > But maybe there was good reasons to not do it this way.
>
> I have an counter example that will not work. Let say
>
> #define b(a, d) a##d
> wchar_t s[] = b(L, "\xabcdabc");
>
> When the lexer process the escape char, you did not know the string
> is wide char or not. That can be changed after the macro expansion.
>
> Chris
Yes, I see.
BTW, I've checked and there is a lot of problems with wide strings.
I'll send some test case later.
Regards,
Luc
next prev parent reply other threads:[~2015-02-04 23:38 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-30 22:16 Bad interaction between macro expansion and literal concatenation Rasmus Villemoes
2015-01-31 1:23 ` [PATCH] Avoid reuse of string buffer when concatening adjacent string litterals Luc Van Oostenryck
2015-02-03 22:38 ` Rasmus Villemoes
2015-02-04 0:32 ` Luc Van Oostenryck
2015-02-04 3:26 ` Christopher Li
2015-02-04 8:39 ` Rasmus Villemoes
2015-02-04 8:58 ` Rasmus Villemoes
2015-02-04 16:20 ` Christopher Li
2015-02-06 21:52 ` Rasmus Villemoes
2015-02-07 1:30 ` Christopher Li
2015-02-09 21:48 ` Damien Lespiau
2015-02-04 2:01 ` [PATCH v2] Avoid reusing string buffer when doing string expansion Luc Van Oostenryck
2015-02-04 5:30 ` Christopher Li
2015-02-04 6:22 ` Luc Van Oostenryck
2015-02-04 8:01 ` Christopher Li
2015-02-04 16:38 ` Christopher Li
2015-02-04 23:38 ` Luc Van Oostenryck
2015-02-06 13:58 ` Christopher Li
2015-02-06 20:32 ` Rasmus Villemoes
2015-02-04 23:38 ` Luc Van Oostenryck [this message]
2015-01-31 5:16 ` Bad interaction between macro expansion and literal concatenation Christopher Li
2015-02-01 2:19 ` [PATCH 0/4] Teach sparse to display data/initial values Luc Van Oostenryck
2015-02-01 2:19 ` [PATCH 1/4] Add support for '-vdata', the equivalent of '-ventry' but for data Luc Van Oostenryck
2015-02-01 2:19 ` [PATCH 2/4] Add support for show_data() Luc Van Oostenryck
2015-02-02 5:30 ` Christopher Li
2015-02-04 0:50 ` Luc Van Oostenryck
2015-02-01 2:19 ` [PATCH 3/4] Teach sparse to display data/initial values Luc Van Oostenryck
2015-02-01 2:19 ` [PATCH 4/4] Small test/exemple for using '-vdata' Luc Van Oostenryck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150204233802.GA2275@macpro.local \
--to=luc.vanoostenryck@gmail.com \
--cc=linux-sparse@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=sparse@chrisli.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).