[External] : Re: [Bug] javac gives non-deterministic output (for sealed interface with records)
Vicente Romero
vicente.romero at oracle.com
Tue Dec 19 14:39:51 UTC 2023
On 12/19/23 02:44, Przemek Bielicki wrote:
> I understand your point. I will work on the reproducer then. When I'm
> successful I will just share a link to github with you - I hope that's OK?
yep that's fine,
>
> In the meantime, can someone please explain to me the meaning of those
> two bytes that switch order?
> I'm sending the classes again, this time in a ZIP file as I guess
> .class extension may be considered as malware by the filters (?).
yes I think that .class are not allowed
>
> Przemek
Thanks,
Vicente
>
> On Mon, Dec 18, 2023 at 10:24 PM Vicente Romero
> <vicente.romero at oracle.com> wrote:
>
> I think that having deterministic output is a very desirable
> property of a compiler but not a guarantee. If such
> non-determinism was provoking a compiler error this would be a
> higher priority error. Also as you determined yourself it is not
> possible to reproduce the issue with the test case you sent. We
> have made efforts in the past to remove sources of non-determinism
> in the compiler and I would say that the ones remaining are harder
> to remove. We could dive deeper with a reproductor but without
> that, it could be a futile effort,
>
> Vicente
>
> On 12/18/23 03:50, Przemek Bielicki wrote:
>> Hey Folks,
>>
>> I'm not 100% sure it's the best idea to post it here but I have
>> no access to the JDK JIRA (yet?) 🙈
>>
>> Last week I had a huge headache because of a bug I discovered in
>> the Java compiler - Eclipse Temurin OpenJDK 64-Bit Server VM
>> 17.0.9+9 (mixed mode, sharing). I'm pretty certain it's a bug
>> because my expectation is that the compiler MUST produce
>> deterministic output of the compiled classes - at least when the
>> JDK version is the same.
>>
>> *## Expected behavior*
>>
>> Java compiler produces deterministic output i.e compiled byte
>> code is exactly the same (SHA-wise) and is independent of the
>> operating system type, version and other variables.
>>
>> *## Bug description*
>>
>> When compiling 1700+ classes in one of our modules on different
>> CI agents (with exact same JDK version) I noticed
>> intermittent SHA differences (of the compiled classes) that
>> originated from a single class (the
>> attached GradleExecGraphNodeExecutionInfo.java file.) It's a
>> sealed interface and it uses records - I have an impression that
>> using these two in conjunction plays a role here.
>>
>> I also attach the compiled bytecode coming from two different CI
>> agents.
>> If you compare the bytecode you will notice this:
>> image.png
>> The only difference (if the image is not displayed correctly) is
>> that two same bytes (at the 0x440 position) switch the order
>> depending on where the class is compiled. I didn't check the
>> meaning of those bytes - I hope you can help here.
>>
>> "javap -c -l -private" shows that the output is exactly the same
>> (but it isn't).
>>
>> The only difference between the CI nodes is the Linux kernel
>> version (Linux 5.4.0-*166*-generic (amd64) vs Linux
>> 5.4.0-*167*-generic (amd64). I was able to reproduce this
>> behavior consistently when I compiled this module on different CI
>> agents with the same difference in the Linux kernel.
>> Here's the screen from Develocity showing the diff in the
>> infrastructure.
>> image.png
>>
>> I tried to reproduce this problem with the minimal reproducer (by
>> extracting the sealed interface outside of the big module) but I
>> failed here. The produced byte code was the same.
>>
>> Please let me know if you need to check sources of the other
>> classes referenced by this sealed interface. I'd need to get an
>> approval before sharing them publicly.
>>
>> Cheers,
>> Przemek
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20231219/cb996f53/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 9238 bytes
Desc: not available
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20231219/cb996f53/image-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 165378 bytes
Desc: not available
URL: <https://mail.openjdk.org/pipermail/compiler-dev/attachments/20231219/cb996f53/image-0003.png>
More information about the compiler-dev
mailing list