File: src/main/java/org/apache/commons/lang3/math/Fraction.java
Issue: org.apache.commons.lang3.math.Fraction does not reduce (Integer.MIN_VALUE, 2^k)
The greatestCommonDivisor method in class Fraction does not find the gcd of Integer.MIN_VALUE and 2^k, and this case can be triggered by taking Integer.MIN_VALUE as the numerator. Note that the case of taking Integer.MIN_VALUE as the denominator is handled explicitly in the getReducedFraction factory method.
FractionTest.java
	// additional test cases
	public void testReducedFactory_int_int() {
		// ...
		f = Fraction.getReducedFraction(Integer.MIN_VALUE, 2);
		assertEquals(Integer.MIN_VALUE / 2, f.getNumerator());
		assertEquals(1, f.getDenominator());

	public void testReduce() {
		// ...
		f = Fraction.getFraction(Integer.MIN_VALUE, 2);
		result = f.reduce();
		assertEquals(Integer.MIN_VALUE / 2, result.getNumerator());
		assertEquals(1, result.getDenominator());

Buggy code:
private static int greatestCommonDivisor(int u, int v) {
    // From Commons Math:
    //if either operand is abs 1, return 1:
    if (Math.abs(u) <= 1 || Math.abs(v) <= 1) {
        return 1;
    }
    // keep u and v negative, as negative integers range down to
    // -2^31, while positive numbers can only be as large as 2^31-1
    // (i.e. we can't necessarily negate a negative number without
    // overflow)
    if (u>0) { u=-u; } // make u negative
    if (v>0) { v=-v; } // make v negative
    // B1. [Find power of 2]
    int k=0;
    while ((u&1)==0 && (v&1)==0 && k<31) { // while u and v are both even...
        u/=2; v/=2; k++; // cast out twos.
    }
    if (k==31) {
        throw new ArithmeticException("overflow: gcd is 2^31");
    }
    // B2. Initialize: u and v have been divided by 2^k and at least
    //     one is odd.
    int t = ((u&1)==1) ? v : -(u/2)/*B3*/;
    // t negative: u was odd, v may be even (t replaces v)
    // t positive: u was even, v is odd (t replaces u)
    do {
        /* assert u<0 && v<0; */
        // B4/B3: cast out twos from t.
        while ((t&1)==0) { // while t is even..
            t/=2; // cast out twos
        }
        // B5 [reset max(u,v)]
        if (t>0) {
            u = -t;
        } else {
            v = t;
        }
        // B6/B3. at this point both u and v should be odd.
        t = (v - u)/2;
        // |u| larger: t positive (replace u)
        // |v| larger: t negative (replace v)
    } while (t!=0);
    return -u*(1<<k); // gcd is u*2^k
}

Fixed code:
private static int greatestCommonDivisor(int u, int v) {
    // From Commons Math:
    if ((u == 0) || (v == 0)) {
        if ((u == Integer.MIN_VALUE) || (v == Integer.MIN_VALUE)) {
            throw new ArithmeticException("overflow: gcd is 2^31");
        }
        return Math.abs(u) + Math.abs(v);
    }
    //if either operand is abs 1, return 1:
    if (Math.abs(u) == 1 || Math.abs(v) == 1) {
        return 1;
    }
    // keep u and v negative, as negative integers range down to
    // -2^31, while positive numbers can only be as large as 2^31-1
    // (i.e. we can't necessarily negate a negative number without
    // overflow)
    if (u>0) { u=-u; } // make u negative
    if (v>0) { v=-v; } // make v negative
    // B1. [Find power of 2]
    int k=0;
    while ((u&1)==0 && (v&1)==0 && k<31) { // while u and v are both even...
        u/=2; v/=2; k++; // cast out twos.
    }
    if (k==31) {
        throw new ArithmeticException("overflow: gcd is 2^31");
    }
    // B2. Initialize: u and v have been divided by 2^k and at least
    //     one is odd.
    int t = ((u&1)==1) ? v : -(u/2)/*B3*/;
    // t negative: u was odd, v may be even (t replaces v)
    // t positive: u was even, v is odd (t replaces u)
    do {
        /* assert u<0 && v<0; */
        // B4/B3: cast out twos from t.
        while ((t&1)==0) { // while t is even..
            t/=2; // cast out twos
        }
        // B5 [reset max(u,v)]
        if (t>0) {
            u = -t;
        } else {
            v = t;
        }
        // B6/B3. at this point both u and v should be odd.
        t = (v - u)/2;
        // |u| larger: t positive (replace u)
        // |v| larger: t negative (replace v)
    } while (t!=0);
    return -u*(1<<k); // gcd is u*2^k
}