Problem of using malloc() without including stdlib.h
Anthony Petrov
anthony.petrov at oracle.com
Fri Feb 3 13:51:22 UTC 2012
Hi Jonathan,
Let's consider e.g.
src/share/native/sun/awt/splashscreen/java_awt_SplashScreen.c mentioned
by you below.
It #includes splashscreen_impl.h. This file #includes
splashscreen_config.h. And finally,
src/solaris/native/sun/awt/splashscreen/splashscreen_config.h #includes
the stdlib.h explicitly.
So, do you still see any issues with java_awt_SplashScreen.c?
Could you please go through your list and verify carefully whether these
files actually #include stdlib.h or not?
--
best regards,
Anthony
On 2/3/2012 12:47 PM, Jonathan Lu wrote:
>
> Sorry for being absent from this thread so long, I just experienced
> couple of days with very limited Internet access.
>
> Actually the problem was firstly found on AIX platform, on which
> sizeof(malloc(1)) without including <stdlib.h> will always give 4
> instead of 8. The symptom was runtime segment error not compiling time
> warnings, and I suspect there're more failures which were not covered in
> my application.
>
> I've checked the build log of Linux64 platform, as Phil mentioned
> there's also no such warnings except for the hotspot diagnostic ones.
> One reason might be that some code inlcudes "malloc.h" instead of
> <stdlib.h>, there's one 'extern' definition in malloc.h on Linux 64
> platform, but I do not see one on AIX platform. I've also tried to trace
> the indirect reference relation ship for all the .c/.cpp files using
> malloc(), still cannot determine a explicit definition of following
> files. pls fix me if anything wrong, because the list is produced
> manually :(
>
> ./src/share/native/sun/awt/splashscreen/splashscreen_png.c
> ./src/share/native/sun/awt/splashscreen/java_awt_SplashScreen.c
> ./src/share/native/sun/awt/splashscreen/splashscreen_gif.c
> ./src/share/native/sun/awt/splashscreen/splashscreen_impl.c
> ./src/share/native/sun/awt/image/dither.c
> ./src/share/native/sun/font/layout/KernTable.cpp
> ./src/share/native/sun/java2d/cmm/lcms/cmserr.c
> ./src/share/native/com/sun/media/sound/PlatformMidi.c
> ./src/share/bin/jli_util.c
> ./src/share/back/debugInit.c
> ./src/share/demo/jvmti/hprof/hprof_init.c
> ./src/share/demo/jvmti/hprof/hprof_table.c
> ./src/share/demo/jvmti/hprof/hprof_util.c
> ./src/windows/native/java/lang/ProcessImpl_md.c
> ./src/windows/native/java/lang/java_props_md.c
> ./src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c
> ./src/windows/native/java/io/dirent_md.c
> ./src/windows/native/java/io/io_util_md.c
> ./src/windows/native/sun/awt/splashscreen/splashscreen_sys.c
> ./src/windows/native/sun/tracing/dtrace/jvm_symbols_md.c
> ./src/windows/native/sun/windows/awt_new.cpp
> ./src/windows/native/sun/windows/CmdIDList.cpp
> ./src/windows/native/sun/nio/ch/DatagramDispatcher.c
> ./src/windows/native/sun/nio/ch/SocketDispatcher.c
> ./src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_MidiIn.cpp
> ./src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_Ports.c
> ./src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_DirectSound.cpp
> ./src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_Util.c
> ./src/windows/native/com/sun/media/sound/PLATFORM_API_WinOS_MidiOut.c
> ./src/solaris/native/sun/java2d/opengl/GLXSurfaceData.c
> ./src/solaris/native/sun/java2d/x11/XRBackendNative.c
> ./src/solaris/native/sun/java2d/x11/X11SurfaceData.c
> ./src/solaris/native/sun/java2d/x11/X11TextRenderer_md.c
> ./src/solaris/native/sun/java2d/x11/X11Renderer.c
>
> For a simple HelloWorld.c, if we use malloc() without including
> stdlib.h, it will give warnings like "warning: incompatible implicit
> declaration of built-in function ‘malloc’". No such warning were found
> from the build log for above files, so I guess there must be some
> headers has got indirect including or declaration of malloc.h, but I'm
> worried because I did not see one via manual search. It indeed sounds
> reasonable to me that if no warnings are produced and the compilation
> runs OK, we may just leave the code untouched, but it will improve
> portability if we can explicitly includes standard C library headers in
> the right place (of cause, the 'right' place is also something need to
> be discussed), right?
>
> And for the 3rd party libraries, for those whose code has been shipped
> with OpenJDK source, they seem OK to me since malloc() has either been
> included or redefined. But for some dependency libraries of compilation,
> such as X11 dev, are they also trustworthy?
>
> Best regards!
> - Jonathan
>
> On 01/19/2012 02:31 AM, Kelly O'Hair wrote:
>> A webrev and a code review from the appropriate teams is indeed needed.
>>
>> -kto
>>
>> On Jan 18, 2012, at 9:56 AM, Phil Race wrote:
>>
>>> Its arguable, whether harmless or not, that each file needs to
>>> include it.
>>> Its not unreasonable for an area of the code to have a header file
>>> such as "awt.h"
>>> that is supposed to be the one that's included by the other files in
>>> that area of
>>> the code, and which takes care of common includes. jni_util.h is not
>>> necessarily it.
>>> There isn't a need for every file to include that.
>>> Also many files are 3rd party libs and I don't like editing those as
>>> the changes
>>> really belong upstream.
>>> So a one size fits all approach might be the answer but I'd want to
>>> make sure
>>> of that first.
>>>
>>> So I'd like to see the list of files that generate actual warnings as
>>> well as the list
>>> of files that reference malloc but don't include stdlib.h.
>>>
>>> We are well aware that returning int as a default is bad in 64 bit ..
>>> I'd expect
>>> instant death so I'd like to see those actual warnings rather than
>>> just the
>>> theoretical ones.
>>>
>>> My grep of a current JDK 8 build log for 64 bit Linux shows the only
>>> malloc warnings
>>> are in hotspot management code. So I am waiting for the proof of the
>>> real problem
>>>
>>> And I can speak for 2d, and if there's 2D files touched I would like
>>> to see any changes
>>> to those files, and the reasoning discussed on 2d-dev ..
>>>
>>> -phil.
>>>
>>> On 1/18/2012 8:26 AM, Kelly O'Hair wrote:
>>>> On Jan 18, 2012, at 12:19 AM, Jonathan Lu wrote:
>>>>
>>>>> Hi core-libs-dev,
>>>>>
>>>>> I found that for some native code of OpenJDK code base, malloc() is
>>>>> used without including header file stdlib.h, such as following files,
>>>>> ./src/solaris/native/sun/java2d/opengl/GLXSurfaceData.c
>>>>> ./src/solaris/native/sun/java2d/x11/XRBackendNative.c
>>>>> ....
>>>>>
>>>>> I assume that there's no hacking tricks involved here, right?
>>>>> because this may cause problem for some C compilers, which assumes
>>>>> 'int' as the default return type of a function if it cannot find
>>>>> the function's declaration during compiling. Under such a
>>>>> condition, actual return result of type 'void*' from malloc() will
>>>>> be converted to 'int', which may result in truncated pointers in
>>>>> 64bit platforms. If the application tries to dereference such a
>>>>> broken pointer, error will occur.
>>>>>
>>>>> Indeed I found some indirect includes of stdlib.h, but there're
>>>>> still some I do not see a stdlib.h get included from any of the
>>>>> direct/indirect included headers. I think in order to fix this
>>>>> problem, two approaches may be considered here,
>>>>> a) add "#include<stdlib.h>" to every missing .c file.
>>>>> b) add "#include<stdlib.h>" to a commonly referenced header file,
>>>>> such as jni_util.h. but it would not be easy to find such a file
>>>>> for all and creating one is the same as approach a).
>>>>>
>>>> I suggest a) It should be harmless and is the right thing to do.
>>>>
>>>> It's been a while since I studied the C standard, but I vaguely
>>>> recall that there was another standard C include file
>>>> that would cause the malloc() prototype declaration to show up.
>>>> Or maybe it wasn't a standard one. In any case, I think your a)
>>>> approach is correct and I don't see much a need
>>>> for detailed discussions on this, as long as it builds correctly
>>>> with no warnings on all platforms. It should be fine and correct.
>>>> That's my 2 cents.
>>>>
>>>> -kto
>>>>
>>>>> But both methods need to change many files, any other ideas about
>>>>> how to fix it more elegantly?
>>>>>
>>>>> Thanks and best regards!
>>>>> - Jonathan
>>>>>
>
More information about the core-libs-dev
mailing list