-
Notifications
You must be signed in to change notification settings - Fork 511
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
[BUG] CSVWriter 写入CSV数据超过 65536 个字节时报错 #2848
Comments
堆栈信息可以发一下么? |
简单的堆栈信息就是我上面发的,线上环境的堆栈信息在记录日志时做了精简,只会显示最近2行 + 本应用包名开头的,所以暂时没有完整的堆栈信息。 我们目前是临时通过 每 |
通过上述简单关键堆栈信息里的 报错文件名称 和 行数,再结合报错异常分析,也能定位到具体的问题。 在这里,把 |
如果这里有问题,应该是很多个地方都会有问题,应该是某个地方的offset计算错了,你本地方便做调试么?看调用这个之前是什么操作,最后一列是什么类型? |
try (CSVWriter writer = CSVWriter.of()) {
writer.writeValue("1".repeat(65531));
writer.writeComma();
writer.writeValue(new BigDecimal("1.00"));
writer.writeComma(); // java.lang.ArrayIndexOutOfBoundsException: Index 65536 out of bounds for length 65536
} 前几天比较忙,今天调试了一下,发现 write BigDecimal 刚好达到 65536 时,内部并没有 |
https://oss.sonatype.org/content/repositories/snapshots/com/alibaba/fastjson2/fastjson2/2.0.53-SNAPSHOT/ |
@wenshao 用新版本测试了下,writeBigDecimal 的问题已经解决了,不过又发现了一个类似的 bug。 OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
writer.writeValue("1".repeat(65534));
writer.writeComma();
writer.writeString("123"); // java.lang.StringIndexOutOfBoundsException: offset 65535, count 3, length 65536
} fastjson2/core/src/main/java/com/alibaba/fastjson2/support/csv/CSVWriterUTF16.java Lines 141 to 149 in a122b8d
定位了下,如上所示,是 错误堆栈信息如下:
发现这些 bug 有些随机,必须要恰好构造出符合特定条件的数据才能出现。 |
@wenshao
我先构造一个 65535 容量的 Writer buffer,然后依次调用每一个 OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
writer.writeValue("1".repeat(65534));
writer.writeComma();
writer.writeLocalDateTime(LocalDateTime.now()); // java.lang.ArrayIndexOutOfBoundsException: Index 65539 out of bounds for length 65536
// 【writeInstant(Instant instant) 也受此影响】
} 还有 OutputStreamWriter out = new OutputStreamWriter(new ByteArrayOutputStream(), StandardCharsets.UTF_8);
try (CSVWriter writer = CSVWriter.of(out)) {
writer.writeValue("1".repeat(65534));
writer.writeComma();
writer.writeString("2".repeat(65537)); // java.lang.StringIndexOutOfBoundsException: offset 65535, count 65537, length 65536
// 【CSVWriterUTF16.writeString(byte[] utf8) 也受此影响】
} |
问题描述
我们使用 Fastjson2 用于生成 CSV 格式的数据文件。
写入少量数据时,一切表现正常。
然而,当写入超过 65536 个字节的数据时,就会触发如下数组越界异常 。
通过异常堆栈信息得知报错代码位置如下:
fastjson2/core/src/main/java/com/alibaba/fastjson2/support/csv/CSVWriterUTF8.java
Lines 48 to 53 in a122b8d
如果之前
CSVWriterUTF8.off
已经是 65536,本次再调用writeComma()
方法时,由于bytes.length
固定是 65536,并不满足if( off + 1 == bytes.length )
的if
条件,因此触发越界异常。此外,我们恰好在该数据量边界写入的是字符串,也得到了一个类似的异常:
环境信息
请填写以下信息:
期待的正确结果
正常写入,不再报错。
The text was updated successfully, but these errors were encountered: