侧边栏壁纸
博主头像
咿呀咿呀

你的脚步太乱,所以行程有限

  • 累计撰写 29 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论
标签搜索

CC4

咿呀咿呀
2022-08-31 / 0 评论 / 0 点赞 / 35 阅读 / 1,063 字
温馨提示:
本文最后更新于 2022-08-31,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
切入点

重点还是在ChainedTransformer中找transform的调用

image-20220831092218363

再找谁的readObject调用了compare

PriorityQueue这个类中,发现readObject调用了heapify

image-20220831093140268

    private void heapify() {
        for (int i = (size >>> 1) - 1; i >= 0; i--)
            siftDown(i, (E) queue[i]);  //----siftDown---
    }
    
        private void siftDown(int k, E x) {
        if (comparator != null)
            siftDownUsingComparator(k, x);  ///---siftDownUsingComparator---
        else
            siftDownComparable(k, x);
    }
    
           private void siftDownUsingComparator(int k, E x) {
        int half = size >>> 1;
        while (k < half) {
            int child = (k << 1) + 1;
            Object c = queue[child];
            int right = child + 1;
            if (right < size &&
                comparator.compare((E) c, (E) queue[right]) > 0)
                c = queue[child = right];
            if (comparator.compare(x, (E) c) <= 0)   //----comparator--
                break;
            queue[k] = c;
            k = child;
        }
        queue[k] = x;
    }

image-20220831094648753

切入

代码执行的地方和CC3一样

image-20220831165054724

运行、无报错、无弹窗。下断点调试

image-20220831165217331

步入

image-20220831165819768

可以看见运行到这 seize=0,进不去siftDown,当size至少为2时,此时运算后、能进去siftDown,

image-20220831170655999

此时size为2,运行报错,报错,报错的原因时第二个priorityQueue.add

因为add方法调用了offeroffer调用了siftUpsiftUp调用了siftUpUsingComparatorsiftUpUsingComparator调用了compare

image-20220831170932603

这里调用了compare方法、就会往下走调用transform…、就在本地直接执行了。

此处的报错是因为 CC3中的_tfactory反序列化时才会加进来的,现在本地没有,加上后就不会报错了。

image-20220831171353470

这里就需要修改一些东西(TransformingComparator),然后再序列化时复原,就不会导致本地执行了。

image-20220831171833821

0

评论区