-
Notifications
You must be signed in to change notification settings - Fork 547
Open
Labels
bugSomething isn't workingSomething isn't working
Description
问题描述
map的值,存在0E+15这种BigDecimal值,概率出现数组越界异常。
环境信息
请填写以下信息:
- OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.0.44]
重现步骤
如何操作可以重现该问题:
double b = 2d / 3d;
BigDecimal v1 = new BigDecimal("0").setScale(-15);
String vs = v1.toPlainString();
BigDecimal v = new BigDecimal("000").divide(new BigDecimal("3"));
JSONObject m = new JSONObject();
m.put("a", v);
m.put("a1", b);
m.put("a2", v1);
m.put("a3", vs);
Random r = new Random();
for (int i = 0;i< 10000;i++) {
m.put(r.nextInt(100000)+"a"+i, v1);
}
SerializeConfig serializeConfig = new SerializeConfig(SerializeConfig.DEFAULT_PROVIDER);
String str = JSON.toJSONString((Object) m, serializeConfig, SerializerFeature.WriteBigDecimalAsPlain, SerializerFeature.DisableCircularReferenceDetect);期待的正确结果
能够序列化成0
相关日志输出
java.lang.StringIndexOutOfBoundsException: offset 41472, count 1, length 41472
at java.base/java.lang.String.checkBoundsOffCount(String.java:4591)
at java.base/java.lang.String.getChars(String.java:1679)
at com.alibaba.fastjson2.JSONWriterUTF16.writeDecimal(JSONWriterUTF16.java:1309)
at com.alibaba.fastjson2.writer.ObjectWriterImplMap.write(ObjectWriterImplMap.java:507)
at com.alibaba.fastjson2.JSONWriter.writeAny(JSONWriter.java:1420)
at com.alibaba.fastjson.JSON.toJSONString(JSON.java:1690)
附加信息
问题原因
com.alibaba.fastjson2.JSONWriterUTF16#writeDecimal

scale = -15,导致后面的ensureCapacity未扩容,正好off == chars.length。最终chars插入0时出现数组越界
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working