Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6778657

Casts in SharedRuntime::f2i, f2l, d2i and d2l rely on undefined C++ behaviour

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P4 P4
    • hs15
    • 7
    • hotspot
    • None
    • b01
    • generic, x86
    • generic, linux

        Submitted by Gary Benson

        icedtea-f2i-overflow.patch - may produce results different from current.

        diff -r dcb49b482348 -r f63a8dee04ae openjdk/hotspot/src/share/vm/runtime/sharedRuntime.cpp
        --- openjdk/hotspot/src/share/vm/runtime/sharedRuntime.cpp Mon Nov 03 14:00:57 2008 +0000
        +++ openjdk/hotspot/src/share/vm/runtime/sharedRuntime.cpp Mon Nov 03 15:56:17 2008 +0000
        @@ -173,64 +173,46 @@ JRT_END


         JRT_LEAF(jint, SharedRuntime::f2i(jfloat x))
        - if (g_isnan(x)) {return 0;}
        - jlong lltmp = (jlong)x;
        - jint ltmp = (jint)lltmp;
        - if (ltmp == lltmp) {
        - return ltmp;
        - } else {
        - if (x < 0) {
        - return min_jint;
        - } else {
        - return max_jint;
        - }
        - }
        + if (g_isnan(x))
        + return 0;
        + if (x >= (jfloat) max_jint)
        + return max_jint;
        + if (x <= (jfloat) min_jint)
        + return min_jint;
        + return (jint) x;
         JRT_END


         JRT_LEAF(jlong, SharedRuntime::f2l(jfloat x))
        - if (g_isnan(x)) {return 0;}
        - jlong lltmp = (jlong)x;
        - if (lltmp != min_jlong) {
        - return lltmp;
        - } else {
        - if (x < 0) {
        - return min_jlong;
        - } else {
        - return max_jlong;
        - }
        - }
        + if (g_isnan(x))
        + return 0;
        + if (x >= (jfloat) max_jlong)
        + return max_jlong;
        + if (x <= (jfloat) min_jlong)
        + return min_jlong;
        + return (jlong) x;
         JRT_END

         JRT_LEAF(jint, SharedRuntime::d2i(jdouble x))
        - if (g_isnan(x)) {return 0;}
        - jlong lltmp = (jlong)x;
        - jint ltmp = (jint)lltmp;
        - if (ltmp == lltmp) {
        - return ltmp;
        - } else {
        - if (x < 0) {
        - return min_jint;
        - } else {
        - return max_jint;
        - }
        - }
        + if (g_isnan(x))
        + return 0;
        + if (x >= (jdouble) max_jint)
        + return max_jint;
        + if (x <= (jdouble) min_jint)
        + return min_jint;
        + return (jint) x;
         JRT_END


         JRT_LEAF(jlong, SharedRuntime::d2l(jdouble x))
        - if (g_isnan(x)) {return 0;}
        - jlong lltmp = (jlong)x;
        - if (lltmp != min_jlong) {
        - return lltmp;
        - } else {
        - if (x < 0) {
        - return min_jlong;
        - } else {
        - return max_jlong;
        - }
        - }
        + if (g_isnan(x))
        + return 0;
        + if (x >= (jdouble) max_jlong)
        + return max_jlong;
        + if (x <= (jdouble) min_jlong)
        + return min_jlong;
        + return (jlong) x;
         JRT_END

              kvn Vladimir Kozlov
              xdono Xiomara Jayasena (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: