JDK 14 RFR of JDK-8231262: Suppress warnings on non-serializable instance fields in security libs serializable classes

Joe Darcy joe.darcy at oracle.com
Thu Sep 26 20:10:07 UTC 2019


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?

Cheers,

-Joe




More information about the security-dev mailing list