On 04.09.2013 01:45, Philip Martin wrote: > ../src/subversion/bindings/javahl/native/CreateJ.cpp:861:30: warning: > comparison between signed and unsigned integer expressions [-Wsign-compare] > ../src/subversion/bindings/javahl/native/JNIUtil.cpp:665:36: warning: > comparison between signed and unsigned integer expressions [-Wsign-compare] > > Both of these are similar: > > 664 1456343 brane const jsize stSize = > static_cast<jsize>(newStackTra > ce.size()); > 665 1456343 brane if (stSize != newStackTrace.size()) > 666 1456343 brane { > 667 1456343 brane > env->ThrowNew(env->FindClass("java.lang.ArithmeticException"), > 668 1456343 brane "Overflow converting C size_t > to JNI jsize"); > 669 1456343 brane POP_AND_RETURN_NOTHING(); > 670 1456343 brane }
Hmmm ... I don't recall writing that. But no matter. > According to the log this is an attempt to detect overflow. Does it > work? jsize is a signed integer type and newStackTrace.size is an an > unsigned type. The types could be different sizes and I think the test > is designed to trigger when the unsigned type is larger than the signed > type and the value is truncated. However the test fails to trigger when > the cast produces a negative value because the types are the same size > and the unsigned value is bigger than the maximum signed value. > > I don't think we can use an unsigned type here so I think we need to > compare with something like std::numeric_limits<jsize>::max() Not necessary. The condition should be if (stSize < 0 || stSize != newStackTrace.size()) and then the warning should go away, too; the compiler should know that both comparands in the second condition are non-negative. BTW I've no idea why I don't get these warnings when I build JavaHL. -- Brane -- Branko Čibej | Director of Subversion WANdisco // Non-Stop Data e. br...@wandisco.com