RFR: 8214976: Warn about uses of functions replaced for portability

Kim Barrett kbarrett at openjdk.java.net
Wed Jan 5 04:12:16 UTC 2022


On Tue, 4 Jan 2022 19:23:24 GMT, Harold Seigel <hseigel at openjdk.org> wrote:

> Please review this change for JDK-8214976.  This change adds attribute warnings to header file compilerWarnings.hpp so that compilation warnings get issued when certain system functions are called directly, instead of hotspot's os:: versions of the functions.  Many additional files were changed because of compilation warnings resulting from the compilerWarnings.hpp changes.
> 
> A sample warning is:
> 
> .../open/test/hotspot/gtest/logging/test_log.cpp:63:19: error: call to 'fopen' declared with attribute warning: use os::fopen [-Werror=attribute-warning]
>    63 |   FILE* fp = fopen(TestLogFileName, "r");
>       |              ~~~~~^~~~~~~~~~~~~~~~~~~~~~
> 
> 
> Note that changing src/hotspot/os/linux/gc/z/zMountPoint_linux.cpp to call os:: functions requires adding "#include "runtime/os.hpp" and caused test gc/z/TestAllocateHeapAt.java to fail.  So, for now, I just added PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION to zMountPoint_linux.cpp.  There's a similar issue with gtest/logging/test_logDecorators.cpp.
> 
> Attribute warnings for additional functions, such as malloc(), were not included in this change because they require lots of source code changes.
> 
> This change was tested by running mach5 tiers 1-2 on Linux, Mac OS, and Windows, Mach5 tiers 3-5 on Linux x64.  Also, builds were done on Linux-zero, Linux-s390, and Linux-ppc.
> 
> Thanks, Harold

Changes requested by kbarrett (Reviewer).

src/hotspot/os/aix/os_aix.cpp line 111:

> 109: #include <sys/vminfo.h>
> 110: 
> 111: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(close); // prevents compiler warnings for all functions

Why suppress the warning for this file?  I think there are only 3 calls to `close`, so it seems like they could just be fixed.

src/hotspot/os/bsd/os_bsd.cpp line 110:

> 108: #endif
> 109: 
> 110: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(close); // prevents compiler warnings for all functions

Again here, why suppress the warning rather than fix the small number of calls in this file.

src/hotspot/os/linux/gc/z/zMountPoint_linux.cpp line 37:

> 35: #define PROC_SELF_MOUNTINFO        "/proc/self/mountinfo"
> 36: 
> 37: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(fopen);

The intended usage for this pragma is to scope it narrowly, using `PRAGMA_DIAG_PUSH/POP`.

src/hotspot/os/linux/os_linux.cpp line 153:

> 151: };
> 152: 
> 153: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(closedir);  // prevents compiler warning for all functions

Why suppress this warning rather than fix the one call.  Note the `closedir` in `os::dir_is_empty` is in the `os` "namespace" and hence is already calling the `os` wrapper.  It could be explicitly qualified anyway, if that seems confusing.

src/hotspot/os/posix/os_posix.cpp line 93:

> 91: #define guarantee_with_errno(cond, msg) check_with_errno(guarantee, cond, msg)
> 92: 
> 93: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(closedir); // prevents compiler warnings for all functions

This should be scoped over the one use, in the implementation of `os::closedir`, rather than applied to the whole file.

src/hotspot/os/windows/os_windows.cpp line 105:

> 103: #include <winsock2.h>
> 104: 
> 105: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(close); // prevents compiler warnings for all functions

The scope of this should be limited to the implementation of the `os::close` function.

src/hotspot/share/compiler/compilerEvent.cpp line 102:

> 100: 
> 101:     index = phase_names->length();
> 102:     phase_names->append(use_strdup ? os::strdup(phase_name) : phase_name);

I'm not sure this change to use `os::strdup` is currently correct.  I'm not sure where the copied string gets freed, but that might be using `::free` rather than `os::free`.  `os::strdup` uses NMT when enabled, and then using `::free` will leak the tracking data.

src/hotspot/share/jvmci/jvmciCodeInstaller.cpp line 511:

> 509:       JVMCI_ERROR_OK("stub should have a name");
> 510:     }
> 511:     char* name = os::strdup(jvmci_env()->as_utf8_string(stubName));

Another `os::strdup` that I'm not sure is correct because I'm not sure where corresponding `free` might be, and whether it is `::free` or `os::free`.

src/hotspot/share/runtime/os.cpp line 93:

> 91: #endif
> 92: 
> 93: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(fopen); // prevents compiler warnings for all functions

Scope should be limited to the implementation of `os::fopen`.

src/hotspot/share/utilities/compilerWarnings.hpp line 87:

> 85:   PRAGMA_DISABLE_GCC_WARNING("-Wattribute-warning")
> 86: 
> 87: FORBID_C_FUNCTION(void abort(void),                            "use os::abort");

It would be better to put all of these after all the `#endif`, so that if we add macro implementations for other platforms (like windows), these will be covered by the additional platforms.

src/hotspot/share/utilities/compilerWarnings.hpp line 112:

> 110: 
> 111: #else
> 112: 

I think, but have not tested it, that this facility can be implemented for Visual Studio using `__declspec(deprecated)` and suppressing warning C4996.  Of course, doing that may trigger a bunch of warnings in Windows-specific files, so it might be best to do that as a followup change.

test/hotspot/gtest/logging/test_logDecorators.cpp line 29:

> 27: #include "unittest.hpp"
> 28: 
> 29: PRAGMA_PERMIT_FORBIDDEN_C_FUNCTION(strdup);

Why suppress this warning?  Why not just fix the couple of calls, and remember to also fix the corresponding calls to `::free` to instead call `os::free`.

-------------

PR: https://git.openjdk.java.net/jdk/pull/6961


More information about the hotspot-dev mailing list