JDK 14 RFR of JDK-8231262: Suppress warnings on non-serializable instance fields in security libs serializable classes
Sean Mullan
sean.mullan at oracle.com
Thu Sep 26 20:20:42 UTC 2019
On 9/26/19 4:10 PM, Joe Darcy wrote:
> Hi Sean,
>
> On 9/26/2019 12:46 PM, Sean Mullan wrote:
>> On 9/23/19 4:16 PM, Joe Darcy wrote:
>>> Hi Sean,
>>>
>>> On 9/23/2019 12:19 PM, Sean Mullan wrote:
>>>> Hi Joe,
>>>>
>>>> It's a little odd to suppress the warnings in the X509CertImpl class
>>>> since it is a subclass of java.security.cert.Certificate which
>>>> implements the writeReplace method so these fields are not serialized.
>>>>
>>>> Also for other classes like X509Key which are internal it is a
>>>> little odd to suppress the warnings for fields like bitStringKey
>>>> that are not Serializable and are never serialized. It is probably
>>>> better to mark them as transient, but I'm not really sure it is
>>>> worth making those changes for otherwise stable code. I guess when I
>>>> look at some of the warnings, I might think there is an issue when
>>>> there really isn't.
>>>>
>>>> I suppose these are not things you can easily detect at compile
>>>> time, but I am wondering what you think.
>>>>
>>>>
>>> Thanks for the feedback. One motivation to send out these review is
>>> to help tune-up the warning analysis.
>>>
>>> A brief philosophical note, when designing any sort of warning scheme
>>> the cost of false positives vs false negatives needs to be weighed as
>>> any static check can likely only approximate the full range of
>>> dynamic behavior. The checks as written give up, i.e. do not attempt
>>> to analyze and warn, if the class uses serialPersistentFields. It
>>> would be possible for the checks to similarly decline to analyze if
>>> any of the various write* or read* serialization methods are defined.
>>> My current impression is that the net benefit for the checks when
>>> write* methods are defined is still worthwhile, even though there are
>>> some false positives.
>>>
>>> As you observe, given the handling of the serial methods,
>>> bitStringKey in X509Key is effectively transient. I think it would be
>>> better serial coding for the field to be explicitly marked as
>>> transient to make it more obviously consistent with the
>>> implementation. Moreover, all the instance fields in X509Key except
>>> encodedKey look to be effectively transient. Since the class already
>>> has a serialVersionUID, marking the fields as transient is a
>>> serial-compatible change.
>>
>> Ok. Well I understand that the benefit here is to try to detect
>> serialization issues, and that is great. But at least in some cases
>> like in security libs where classes are doing their own alternate
>> serialization and have more than a few fields, the workaround of
>> leaving the warnings in or having to mark all the fields as transient
>> - either approach is not ideal to me. Could the
>> SuppressWarnings("serial") annotation be applied at the class level so
>> that it basically said "I know what I'm doing here, don't warn me
>> about serialization issues"?
>
> Yes; applying SuppressWarnings("serial") to the class will silence this
> new warning for all the fields. I didn't take that approach in the
> version I sent to review since, by default, I wanted to provide the
> narrowest scope of the suppression.
>
> Would you prefer I revise the patch where there are multiple
> SuppressWarnings("serial") on fields to put a single one on the class
> instead?
Yes, but only in the cases where we are clearly using some form of
alternate serialization like ASN.1 encoding. I need to double-check the
review again (it's a bit more time consuming because I have to look at
the code in more detail), but the two that I spotted so far are:
src/java.base/share/classes/sun/security/x509/X509CertImpl.java
src/java.security.jgss/share/classes/sun/security/krb5/internal/KRBError.java
(from the JDK-8231368 review)
--Sean
More information about the security-dev
mailing list