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. brane_at_wandisco.com
Received on 2013-09-04 05:22:00 CEST