I ran into this myself just now...
While we could, of course, disable the warning, I wonder if this is the
right way to go. It seems to be deprecated for good reasons. See the
readdir_r man page:
http://man7.org/linux/man-pages/man3/readdir_r.3.html
I quote:
It is recommended that applications usereaddir(3)
<http://man7.org/linux/man-pages/man3/readdir.3.html> instead of
*readdir_r*(). Furthermore, since version 2.24, glibc deprecates
*readdir_r*(). The reasons are as follows:
* On systems where*NAME_MAX *is undefined, calling*readdir_r*() may be
unsafe because the interface does not allow the caller to specify
the length of the buffer used for the returned directory entry.
* On some systems,*readdir_r*() can't read directory entries with
very long names. When the glibc implementation encounters such a
name,*readdir_r*() fails with the error*ENAMETOOLONG */after the/
/final directory entry has been read/. On some other systems,
*readdir_r*() may return a success status, but the returned/d_name/
field may not be null terminated or may be truncated.
* In the current POSIX.1 specification (POSIX.1-2008),readdir(3)
<http://man7.org/linux/man-pages/man3/readdir.3.html> is
not required to be thread-safe. However, in modern
implementations (including the glibc implementation), concurrent
calls toreaddir(3)
<http://man7.org/linux/man-pages/man3/readdir.3.html> that specify different
directory streams are
thread-safe. Therefore, the use of*readdir_r*() is generally
unnecessary in multithreaded programs. In cases where multiple
threads must read from the same directory stream, usingreaddir(3)
<http://man7.org/linux/man-pages/man3/readdir.3.html>
with external synchronization is still preferable to the use of
*readdir_r*(), for the reasons given in the points above.
* It is expected that a future version of POSIX.1 will make
*readdir_r*() obsolete, and require thatreaddir(3)
<http://man7.org/linux/man-pages/man3/readdir.3.html> be thread-safe
when concurrently employed on different directory streams.
/Magnus
On 2018-03-12 08:45, Thomas Stüfe wrote:
Thanks a lot for digging this up! That may very well be.
I see that we locally disable the warning in os_linux.inline.hpp. My error
happens when compiling the jdk, among others TimeZone_md.c. I do not see
that we pass -Wdeprecated-declarations.
I am still unsure whether this is a new issue or an existing one I
uncovered in by environment. Unfortunately I have to drive to the office
now and will then be back in gcc 4.8 land. Have to pick this up again next
weekend (or just install a saner Linux).
Thank you!
Thomas
On Mon, Mar 12, 2018 at 8:26 AM, David Holmes <david.hol...@oracle.com>
wrote:
We already dealt with this in the VM:
http://hg.openjdk.java.net/jdk10/master/rev/f5f2a2d13775
by disabling the warning.
That suggests to me that this warning must have been disabled in the JDK
build too. So perhaps recent flag reworking has modified that. ??
David
On 12/03/2018 5:15 PM, David Holmes wrote:
Hi Thomas,
On 12/03/2018 5:02 PM, Thomas Stüfe wrote:
Hi all,
maybe someone has an idea:
I build on a freshly installed Linux instance (MX17), using gcc 6.3.0.
I get this error:
Creating support/modules_cmds/jdk.pack/unpack200 from 7 file(s)
/shared/projects/openjdk/jdk-hs/source/src/jdk.management/un
ix/native/libmanagement_ext/OperatingSystemImpl.c:
In function ‘read_dir’:
/shared/projects/openjdk/jdk-hs/source/src/jdk.management/un
ix/native/libmanagement_ext/OperatingSystemImpl.c:83:5:
warning: ‘readdir_r’ is deprecated [-Wdeprecated-declarations]
if (readdir_r(dirp, entry, &p) == 0) {
^~
In file included from
/shared/projects/openjdk/jdk-hs/source/src/hotspot/os/posix/include/jvm_md.h:34:0,
from
/shared/projects/openjdk/jdk-hs/source/src/hotspot/share/include/jvm.h:32,
from
/shared/projects/openjdk/jdk-hs/source/src/jdk.management/un
ix/native/libmanagement_ext/OperatingSystemImpl.c:29:
/usr/include/dirent.h:183:12: note: declared here
extern int readdir_r (DIR *__restrict __dirp,
^~~~~~~~~
I digged and was not able to pin it to any recent change. I also think I
never successfully built on this box, so it may be my environment.
Could it be that my gcc is too new?
We've built with gcc 7 so it can't be that on its own. May be a
combination of gcc and glibc version. It was deprecated in glibc 2.24.
David
Thanks! Thomas