RFR: 8308031: Linkers should reject unpromoted variadic parameters

Maurizio Cimadamore mcimadamore at openjdk.org
Wed May 31 15:44:04 UTC 2023


On Wed, 31 May 2023 15:39:31 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:

>> In C, arguments smaller than `int` are promoted to (`unsigned`) `int`, and `float` is promoted to `double`, when being passed as variadic argument (see e.g. https://en.cppreference.com/w/c/language/conversion#Default_argument_promotions). This patch restricts the layouts that can be used as variadic layouts to what is allowed by the C specification.
>> 
>> The fallback linker is also updated to use to correct function to link variadic calls (not doing this turned out not to be a problem so far, but it is problematic for instance on Mac/AArch64 when using the fallback linker). Adding the restriction on layouts for all linkers is also partly motivated by the fallback linker rejecting such unsupported variadic layouts already.
>> 
>> I've added a small paragraph to the Linker javadoc as well that explains the restriction. Comments on that are welcome, but please explain.
>> 
>> The tests are updated to no longer try to link variadic functions with the illegal layouts, and I've added some more negative tests to TestIllegalLink.
>> 
>> Testing:
>> - local testing on Windows/x64
>> - tier1-3 + jdk-tier5 (ongoing)
>> - manual test run on mac/aarch64 with the fallback linker to verify the correctness of the fallback linker changes.
>
> test/jdk/java/foreign/StdLibTest.java line 386:
> 
>> 384:             return arena.allocateUtf8String("str");
>> 385:         }, "str"),
>> 386:         CHAR(int.class, C_INT, "%c", arena -> (int) 'h', (int) 'h'), // promote to int, per C spec
> 
> is it important to retain this, given that there's already an INT case?

Maybe adding a long case would be more useful?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/14225#discussion_r1211927710


More information about the core-libs-dev mailing list