Re: new StringBuilder(char)

2014-08-16 Thread Ulf Zibis

Good catch ;-)

-Ulf


Am 08.08.2014 um 22:53 schrieb Eddie Aftandilian:


Re: new StringBuilder(char)

2014-08-16 Thread Andrew Thompson
I've encountered bugs in production code due to this surprise. 

A good thing to fix. 

 On Aug 16, 2014, at 1:38 AM, Jeremy Manson jeremyman...@google.com wrote:
 
 No love from core-libs-dev?  It's backwards-incompatible, but in a way that
 would unbreak existing broken code.  Might be a worthwhile cleanup.
 
 Jeremy
 
 
 On Fri, Aug 8, 2014 at 1:53 PM, Eddie Aftandilian eaf...@google.com wrote:
 
 Hi all,
 
 We recently realized that calling new StringBuilder(char) does not do what
 you would think it does.  Since there is no char constructor defined, the
 char is widened to an int and the StringBuffer is presized to the
 character's encoded value.  Thus code like this prints an empty string
 rather than the expected a:
 System.out.println(new StringBuilder('a'));
 
 Would it be possible to add a char constructor to StringBuilder to prevent
 this problem? I understand this would change the behavior of any code that
 is currently doing this, but it's hard to imagine anyone doing this
 intentionally.  Of the ~20 instances we found in Google's codebase, all
 were bugs.  What is your policy on making changes like this where (a) it
 will cause a change in behavior, but (b) the currently behavior is clearly
 wrong?
 
 If you're willing to take the change, I'd be happy to send a patch.
 
 Thanks,
 Eddie
 


Re: new StringBuilder(char)

2014-08-16 Thread Pavel Rappo
Yup,

HG:

changeset: 4823:194faa6fdb3c
user: sherman
date: Mon Dec 05 10:50:14 2011 -0800
files: src/share/classes/java/util/Formatter.java 
test/java/util/MissingFormatArgumentException/GetFormatSpecifier.java
description: 5063455: (fmt) MissingFormatArgumentException.getFormatSpecifier() 
incorrect return value
Summary: updated the incorrect StringBuilder constructor usage
Reviewed-by: dholmes, sherman
Contributed-by: brandon.passan...@oracle.com

JBS:

https://bugs.openjdk.java.net/browse/JDK-5063455

-Pavel

On 16 Aug 2014, at 20:17, Louis Wasserman lowas...@google.com wrote:

 There are indications this bug has actually occurred in released JDK code
 before



Re: new StringBuilder(char)

2014-08-16 Thread Michael Kay
I think the same problem also appears in StringBuffer and has been remarked on 
repeatedly over the years, e.g.

http://osdir.com/ml/java.findbugs.general/2007-02/msg00068.html


Michael Kay
Saxonica
m...@saxonica.com
+44 (0) 118 946 5893




On 16 Aug 2014, at 20:17, Louis Wasserman lowas...@google.com wrote:

 There are indications this bug has actually occurred in released JDK code
 before (!!):
 
 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Formatter.java#2882
 
 To give credit where credit is due, I reported the potential for this issue
 to Eddie after seeing it on StackOverflow at
 http://stackoverflow.com/q/25167015.
 On Aug 16, 2014 5:39 AM, Andrew Thompson lordpi...@me.com wrote:
 
 I've encountered bugs in production code due to this surprise.
 
 A good thing to fix.
 
 On Aug 16, 2014, at 1:38 AM, Jeremy Manson jeremyman...@google.com
 wrote:
 
 No love from core-libs-dev?  It's backwards-incompatible, but in a way
 that
 would unbreak existing broken code.  Might be a worthwhile cleanup.
 
 Jeremy
 
 
 On Fri, Aug 8, 2014 at 1:53 PM, Eddie Aftandilian eaf...@google.com
 wrote:
 
 Hi all,
 
 We recently realized that calling new StringBuilder(char) does not do
 what
 you would think it does.  Since there is no char constructor defined,
 the
 char is widened to an int and the StringBuffer is presized to the
 character's encoded value.  Thus code like this prints an empty string
 rather than the expected a:
 System.out.println(new StringBuilder('a'));
 
 Would it be possible to add a char constructor to StringBuilder to
 prevent
 this problem? I understand this would change the behavior of any code
 that
 is currently doing this, but it's hard to imagine anyone doing this
 intentionally.  Of the ~20 instances we found in Google's codebase, all
 were bugs.  What is your policy on making changes like this where (a) it
 will cause a change in behavior, but (b) the currently behavior is
 clearly
 wrong?
 
 If you're willing to take the change, I'd be happy to send a patch.
 
 Thanks,
 Eddie
 
 



Re: new StringBuilder(char)

2014-08-16 Thread Ulf Zibis

Additionally nice to have:
(initial capacity with initial char(s))
StringBuilder(int,char)
StringBuilder(int,CharSequence)

-Ulf


Am 08.08.2014 um 22:53 schrieb Eddie Aftandilian:

Hi all,

We recently realized that calling new StringBuilder(char) does not do what
you would think it does.  Since there is no char constructor defined, the
char is widened to an int and the StringBuffer is presized to the
character's encoded value.  Thus code like this prints an empty string
rather than the expected a:
System.out.println(new StringBuilder('a'));

Would it be possible to add a char constructor to StringBuilder to prevent
this problem? I understand this would change the behavior of any code that
is currently doing this, but it's hard to imagine anyone doing this
intentionally.  Of the ~20 instances we found in Google's codebase, all
were bugs.  What is your policy on making changes like this where (a) it
will cause a change in behavior, but (b) the currently behavior is clearly
wrong?

If you're willing to take the change, I'd be happy to send a patch.

Thanks,
Eddie