尝试引发ArrayOutOfBoundsException的Android ART崩溃

时间:2018-09-21 19:07:46

标签: java android crash

我们经常看到Android的ART代码崩溃。我们正在索引一个int数组,而没有进行边界检查,然后捕获Java的ArrayIndexOutOfBoundsException并正确地对其进行处理。

我们在具有各种Java版本的PC上运行此代码,并且该代码可以正常运行。但是,在Android上,代码有时会爆炸。

我们的一些源代码:

1. <#assign array=[0]>
2. <#list array as a>
3.    ${a}
4.      <#assign array = array + [1]><#assign array = array + [1]><#assign array = array + [1]>
5.      <#list array as c>
6.          ${c}
7.      </#list>
8. </#list>

我无法创建一个简单的测试用例,因为我期望Android ART库中存在某种多线程竞争条件。

“ I / ObjectDBSet:changesComplete”来自不同的线程(请参阅“消息处理器”线程),但是可以触摸调用getFieldTraits()的对象之一。 int tmp []是最终的,因此将不会更改。此外,不会替换或更改DataObjectInfo和IdToIndexData对象。

无论哪种方式,另一个线程都不应导致Android的ART库崩溃。

Android版本/设备:

具有Android 7.0内部版本号NRD90M.T580UEU2BQL1的三星Galaxy Tab A。

从Android Studio:

内部版本:3.1.4,AI-173.4907809、201807232114,

AI-173.4907809,JRE 1.8.0_152-release-1024-b01x64 JetBrains s.r.o,OS Linux(amd64)v4.15.0-34(未知),屏幕1920x1080、2560x1600

Android Gradle插件:3.1.4 摇篮:4.4 NDK:来自local.properties :(未指定);最新的SDK :(未找到); LLDB:找不到固定的修订版3.1; SDK的最新消息:(未找到软件包); CMake:来自local.properties :(未指定);最新的SDK :(未找到);来自PATH :(未找到);

崩溃的完整输出:

class IdToIndexData {
   private final int tmap[]; // Contents are set elsewhere

    int getTraitsIndexUnchecked(int id) {
        return tmap[id];
    }
}

class DataObjectInfo {
   public Integer getFieldTraits(Class1 map, int id) {
            int traitsIndex=map.getTraitsIndexUnchecked(id);
            return traitsIndex;
        } catch (ArrayIndexOutOfBoundsException e) {
            return null;
        }
    }
}

注意:删除了一些刚刚等待达到StackOverFlow的30,000 char限制以下的线程。

更新1

我的问题是寻找解决方法(我们可以实现自己的边界检查,但不能这样做,因为几年前的分析表明我们需要改进此代码,这是一种方法去做)。

相反,我正在寻找有关我的代码可能如何导致此问题(即这确实是我的错误)或它是否是已知的Android错误的解释。

1 个答案:

答案 0 :(得分:1)

我发现这是一个Android错误:

https://issuetracker.google.com/issues/116246633

使用边界检查作为解决方法,而不是依靠Android正确引发ArrayIndexOutOfBoundsException。