2

jdkには、array.egに隣接する引数をチェックする場所がたくさんあります。

/*..........
 *
 * @throws IllegalArgumentException
 *         If <tt>offset</tt> is negative or greater than
 *         <tt>buf.length</tt>, or if <tt>length</tt> is negative, or if
 *         the sum of these two values is negative.
 *
 * @param buf   Input buffer (not copied)
 * @param offset    Offset of the first char to read
 * @param length    Number of chars to read
 */
public CharArrayReader(char buf[], int offset, int length) {
    if ((offset < 0) || (offset > buf.length) || (length < 0) ||
            //$ offset+length
        (**(offset + length) < 0)**) {
        throw new IllegalArgumentException();
    }
    this.buf = buf;
    this.pos = offset;
    this.count = Math.min(offset + length, buf.length);
    this.markedPos = offset;
}

なぜ「(オフセット+長さ)<0」が必要なのですか?

4

2 に答える 2

2

Javaではint署名されているため、2つの正intの値を合計すると負の値になる可能性があります。これは、ラップアラウンドまたは整数オーバーフローと呼ばれます

于 2012-12-04T01:07:14.770 に答える
1

オーバーフローをチェックしていると思います。

int の範囲は -2,147,483,648 ~ 2,147,483,647 です。

ご覧のコードから、オフセット + 長さが必要な場所があります。オフセット + 長さが 2,147,483,647 より大きい場合、問題が発生する可能性があり、(オフセット + 長さ) < 0) はそのような場合をチェックしています。

于 2012-12-04T01:09:23.843 に答える