Avoid reuse of string buffer when concatening adjacent string litterals
commit4b039542413937c134acf908007df0bef98551ca
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>
Sat, 31 Jan 2015 01:23:40 +0000 (31 02:23 +0100)
committerDan Carpenter <dan.carpenter@oracle.com>
Wed, 11 Feb 2015 18:51:21 +0000 (11 21:51 +0300)
tree316f5d9016fdac86aeba4417e231e77a87bdf010
parent7594f617fcb814a25bf4c14741dcee2c73dcea18
Avoid reuse of string buffer when concatening adjacent string litterals

In get_string_constant(), the code tried to reuse the storage for the string
but only if the expansion of the string was not bigger than its unexpanded form.
But this fail when the string constant is a sequence of adjacent string litterals
(each being possibly shared, used elsewhere, isolated or in another order).
The minimal exemple would be something like this:

#define P "\001"
const char a[] = P "a";
const char b[] = P "b";

The expansion for 'a' will produce a string which is smaller than
the unexpanded "\001" (2 instead of 4).
By trying to reuse the storage, all further occurrence of "\001"
(probably only from the same 'origin', here the macro P) will then be replaced by "\001a".

The fix is thus to not try to reuse the storage for the string if it consit of
several adjacent litterals.

Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
char.c