Assertions in static blocks ?

Benedict Elliott Smith lists at laerad.com
Fri Mar 5 15:34:19 PST 2010


It's not generally possible to determine if a class initializer will ever be
run.

It would be possible to determine that, if a class were declared with
default (package) level protection and was never referenced by another class
in the package, that the class was not used (so long as the program did not
violate the protection via reflection); but this is the best that could be
achieved (there is an argument to be made for javac to complain in this
case, as it will in the case of unused private classes, however I am not
certain it is necessary), however I do not think this is what you are
suggesting.

It would be possible, if the class were declared with default protection,
and no class in the package referenced anything within it other than
constant fields, to determine that the initialiser was never executed, I
suppose. I'm not a developer of javac but I'm not convinced that it is a
sufficiently useful boundary case to warrant the burden of every execution
of javac in the world calculating it. Probably the increased global power
usage as a result of this would raise the sea level another micrometer or
two for very little benefit in my mind!


On 5 March 2010 23:08, Ulf Zibis <Ulf.Zibis at gmx.de> wrote:

>  Neal, Keith, thanks for your answer.
>
> ... but shouldn't javac claim, that there the code in the static block will
> be *never reached*, if there is no trigger to run it?
>
> -Ulf
>
>
> Am 05.03.2010 22:59, schrieb Neal Gafter:
>
> On Fri, Mar 5, 2010 at 1:47 PM, Ulf Zibis <Ulf.Zibis at gmx.de> wrote:
>
>> No response ??  :-(
>>
>
> Keith's response is correct.  An assertion in a method only occurs when the
> method is executed.  An assertion in a constructor only occurs when the
> constructor is called.  An assertion in a static initializer only occurs
> when the class is statically initialized.  Accessing a constant of the class
> does not initialize the class.  So there is no bug.
>
> Cheers,
> Neal
>
>
>> I've filed a bug:
>>
>>  internal review ID of 1730072
>>
>>
>> -Ulf
>>
>>
>>
>> Am 12.02.2010 15:44, schrieb Ulf Zibis:
>>
>>>  Am 12.02.2010 15:06, schrieb Ulf Zibis:
>>>
>>>> Hi,
>>>>
>>>> in the following example, I have an assert statement in a static block
>>>> of my class.
>>>>
>>>> If accessing the static final constants from another class, the static
>>>> block is not executed.
>>>> This causes the assertions to remain un-proofed, even if -ea -esa is
>>>> set.
>>>>
>>>> Is that correct ?
>>>>
>>>
>>> If yes, javac should claim the code as never reached.
>>>
>>>
>>>> IMO, assertions should always run, if -ea -esa is set.
>>>>
>>>> -Ulf
>>>>
>>>>
>>> -Ulf
>>>
>>>
>>>  >From - Fri Feb 12 16:25:03 2010
>>> X-Account-Key: account2
>>> X-UIDL: 5de5c7b81a751aec6aed7ffb66ca9b90
>>> X-Mozilla-Status: 0000
>>> X-Mozilla-Status2: 00000000
>>> X-Mozilla-Keys:
>>>                       X-Symantec-TimeoutProtection: 0
>>> X-Symantec-TimeoutProtection: 1
>>> X-Symantec-TimeoutProtection: 2
>>> Return-Path: <Keith.McGuigan at Sun.COM> <Keith.McGuigan at Sun.COM>
>>> X-Flags: 1001
>>> Delivered-To: GMX delivery to ulf.zibis at gmx.de
>>> Received: (qmail invoked by alias); 12 Feb 2010 15:12:59 -0000
>>> Received: from brmea-mail-2.Sun.COM (EHLO brmea-mail-2.sun.com)
>>> [192.18.98.43]
>>>  by mx0.gmx.net (mx002) with SMTP; 12 Feb 2010 16:12:59 +0100
>>> Received: from fe-amer-09.sun.com ([192.18.109.79])
>>>    by brmea-mail-2.sun.com (8.13.6+Sun/8.12.9) with ESMTP id
>>> o1CFCw62027512
>>>    for <Ulf.Zibis at gmx.de>; Fri, 12 Feb 2010 15:12:58 GMT
>>> MIME-version: 1.0
>>> Content-transfer-encoding: 7BIT
>>> Content-type: text/plain; CHARSET=US-ASCII; format=flowed
>>> Received: from conversion-daemon.mail-amer.sun.com by mail-amer.sun.com
>>> (Sun Java(tm) System Messaging Server 7u2-7.04 64bit (built Jul  2 2009))
>>> id <0KXQ00800HZH3I00 at mail-amer.sun.com> for Ulf.Zibis at gmx.de; Fri,
>>> 12 Feb 2010 08:12:58 -0700 (MST)
>>> Received: from [129.150.65.45] ([unknown] [129.150.65.45])
>>> by mail-amer.sun.com (Sun Java(tm) System Messaging Server 7u2-7.04
>>> 64bit
>>> (built Jul  2 2009)) with ESMTPSA id <0KXQ00GTLI9L1V60 at mail-amer.sun.com>;
>>> Fri,
>>> 12 Feb 2010 08:12:58 -0700 (MST)
>>> Date: Fri, 12 Feb 2010 10:12:58 -0500
>>> From: Keith McGuigan <Keith.McGuigan at Sun.COM> <Keith.McGuigan at Sun.COM>
>>> Subject: Re: Assertions in static blocks ?
>>> In-reply-to: <4B756071.4000104 at gmx.de>
>>> Sender: Keith.McGuigan at Sun.COM
>>> To: Ulf Zibis <Ulf.Zibis at gmx.de>
>>> Cc: compiler-dev at openjdk.java.net, hotspot <hotspot-dev at openjdk.java.net
>>> >
>>> Message-id: <4B756FFA.9000806 at sun.com>
>>> References: <4B756071.4000104 at gmx.de>
>>> User-Agent: Thunderbird 2.0.0.23 (X11/20090817)
>>> X-GMX-Antivirus: 0 (no virus found)
>>> X-GMX-Antispam: 0 (Mail was not recognized as spam);
>>> Detail=5D7Q89H36p77e5KAPs1l6v/Sb97LojnDmtyzoN37OXMt9GpYHsrWRra7o+psEYuNg/dar
>>>
>>> zWRIb1W0k0rd15IZBf9O4nqjKYX9PrVGG/zPEENchmY89mOrfO0W57R8iRtiMheMiqQP1ym7bl2H
>>>
>>> PZZzg==V1;
>>> X-GMX-UID: ylpHc/1fPjlsBVAdATU22s0zMTE2Ncn9
>>>
>>>
>>>
>>> Hi Ulf -
>>>
>>> Accessing a constant static field in a class does not trigger class
>>> initialization, so your initializer is probably just not being run.
>>>
>>> See
>>> http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#19075
>>>
>>> --
>>> - Keith
>>>
>>> Ulf Zibis wrote:
>>>
>>>> Hi,
>>>>
>>>> in the following example, I have an assert statement in a static block
>>>> of my class.
>>>>
>>>> If accessing the static final constants from another class, the static
>>>> block is not executed.
>>>> This causes the assertions to remain un-proofed, even if -ea -esa is
>>>> set.
>>>>
>>>> Is that correct ?
>>>>
>>>>  IMO, assertions should always run, if -ea -esa is set.
>>>>
>>>> -Ulf
>>>>
>>>>
>>>>
>>>>  package sun.nio.cs.ext;
>>>>
>>>> import static sun.nio.cs.CharsetMapping.*;
>>>>
>>>> /**
>>>>  *
>>>>  * @author Ulf Zibis, Cologne CoSoCo.de
>>>>  */
>>>> class EUC_TWMapping3 extends EUC_TWMapping {
>>>>    static final short PL0_5_B2C_RANGE = 0x2300; // plane 0, 5 b2c range
>>>>    static final short PLANE_B2C_RANGE = 0x1f00; // plane 2..4, 6..15 b2c
>>>> range
>>>>
>>>> // TODO: file bug: static block should run, if assertions are enabled.
>>>>    static {
>>>>        // assert plane offsets and content
>>>>        for (int p=0, range, offset=0; p<b2c.length; p++) {
>>>>            range = p % 4 == 0 ? PL0_5_B2C_RANGE : PLANE_B2C_RANGE;
>>>>            for (int i=range; i<b2c[p].length(); i++)
>>>>                assert b2c[p].charAt(i) == UNMAPPABLE_DECODING;
>>>> // static block should run, if assertions are enabled. For test
>>>> uncomment following line
>>>> //            System.out.printf("offset: %d, range: %d, b2c[p].length():
>>>> %d%n", offset, range, b2c[p].length());
>>>>            assert (offset += range) <= Character.MAX_VALUE + 1;
>>>>        }
>>>>    }
>>>>
>>>> // WORKAROUND:
>>>> //    static int offset = 0; // assert from calling context to force
>>>> static block to process
>>>> //    static {
>>>> //        // assert plane offsets and content
>>>> //        for (int p=0, range; p<b2c.length; p++) {
>>>> //            range = p % 4 == 0 ? PL0_5_B2C_RANGE : PLANE_B2C_RANGE;
>>>> //            for (int i=range; i<b2c[p].length(); i++)
>>>> //                assert b2c[p].charAt(i) == UNMAPPABLE_DECODING;
>>>> //// static block should run, if assertions are enabled. For test
>>>> uncomment following line
>>>> ////            System.out.printf("offset: %d, range: %d,
>>>> b2c[p].length(): %d%n", offset, range, b2c[p].length());
>>>> //            assert (offset += range) <= Character.MAX_VALUE + 1;
>>>> //        }
>>>> //// static block should run, if assertions are enabled. For test
>>>> uncomment following line
>>>> ////        assert false;
>>>> //    }
>>>> }
>>>>
>>>>
>>>> package sun.nio.cs.ext;
>>>>
>>>> /**
>>>>  *
>>>>  * @author Ulf Zibis, Cologne CoSoCo.de
>>>>  */
>>>> public class AssertTest {
>>>>
>>>>    public static void main(String... args) {
>>>> // static block in EUC_TWMapping3 should run, if assertions are enabled.
>>>>        System.out.println(EUC_TWMapping3.PLANE_B2C_RANGE);
>>>> // WORKAROUND: For test uncomment following line
>>>> //        assert EUC_TWMapping3.offset > 0; // force assertion, TODO:
>>>> JDK bug ?
>>>>    }
>>>> }
>>>>
>>>>
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20100305/93d13a4d/attachment.html 


More information about the compiler-dev mailing list