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

GCC 10 warning stringop-overflow with symbol code

    XMLWordPrintable

Details

    • b06

    Backports

      Description

        On 18/06/2020 8:46 am, Koichi Sakata wrote:
        Hi all,

        I tried to build OpenJDK fastdebug with GCC 10.1 on Ubuntu 18.04, but I saw some compiler warnings as follows:

        In file included from
        /home/jyukutyo/code/jdk/src/hotspot/share/classfile/systemDictionary.hpp:31,
                          from
        /home/jyukutyo/code/jdk/src/hotspot/share/classfile/javaClasses.hpp:28,
                          from
        /home/jyukutyo/code/jdk/src/hotspot/share/precompiled/precompiled.hpp:35:
        In member function 'void Symbol::byte_at_put(int, u1)',
             inlined from 'Symbol::Symbol(const u1*, int, int)' at
        /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.cpp:55:16:
        /home/jyukutyo/code/jdk/src/hotspot/share/oops/symbol.hpp:130:18: error:
        writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
           130 | _body[index] = value;
               | ~~~~~~~~~~~~~^~~~~~~

        I can resolve them with the following patch. I believe it fixes those potential bugs, so I'd like to contribute it.
        (Our company has signed OCA.)

        Thanks,
        Koichi

        ===== PATCH =====
        diff -r 20d92fe3ac52 src/hotspot/share/oops/symbol.cpp
        --- a/src/hotspot/share/oops/symbol.cpp Tue Jun 16 03:16:41 2020 +0000
        +++ b/src/hotspot/share/oops/symbol.cpp Thu Jun 18 07:08:50 2020 +0900
        @@ -50,9 +50,10 @@
         Symbol::Symbol(const u1* name, int length, int refcount) {
           _hash_and_refcount = pack_hash_and_refcount((short)os::random(), refcount);
           _length = length;
        - _body[0] = 0; // in case length == 0
        - for (int i = 0; i < length; i++) {
        - byte_at_put(i, name[i]);
        + if (length == 0) {
        + _body[0] = 0;
        + } else {
        + memcpy(_body, name, length);
           }
         }

        diff -r 20d92fe3ac52 src/hotspot/share/oops/symbol.hpp
        --- a/src/hotspot/share/oops/symbol.hpp Tue Jun 16 03:16:41 2020 +0000
        +++ b/src/hotspot/share/oops/symbol.hpp Thu Jun 18 07:08:50 2020 +0900
        @@ -125,11 +125,6 @@
             return (int)heap_word_size(byte_size(length));
           }

        - void byte_at_put(int index, u1 value) {
        - assert(index >=0 && index < length(), "symbol index overflow");
        - _body[index] = value;
        - }
        -
           Symbol(const u1* name, int length, int refcount);
           void* operator new(size_t size, int len) throw();
           void* operator new(size_t size, int len, Arena* arena) throw();

        Attachments

          Issue Links

            Activity

              People

                iklam Ioi Lam
                dholmes David Holmes
                Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved: