Hi Jon, Alan, Chris,

Jon, I have a more conservative version of your patch,
that uses blank finals, only calls currentTimeMillis once instead of 3 times,
and only fails in the unlikely event of currentTimeMillis == Long.MIN_VALUE.

I'm too afraid to remove the anti-inlining entirely.

http://cr.openjdk.java.net/~martin/webrevs/openjdk7/TimeTravel/

Could someone at Oracle file a bug and provide review?
Alan? Chris?

Martin

On Wed, Jul 7, 2010 at 08:00,  <jon.vanal...@redhat.com> wrote:
>
> ----- "Martin Buchholz" <marti...@google.com> wrote:
>
>
>> The JDK should find some other anti-inlining technique.
>>
>
> I would go one step further, and say that perhaps this anti-inlining is no 
> longer necessary.  I tried taking these methods out entirely and simply 
> setting the in/out/err streams to null initially.  This works.  Probably due 
> to some combination of 1) they are later on set from JNI code, and 2) JSR133, 
> which among other things changed some rules about static final variables, 
> notably:
>
> "Static final fields may only be modified in the class initializer that 
> defines them, with the ex-
> ception of the java.lang.System.in, java.lang.System.out, and 
> java.lang.System.err static
> fields, which can be modified by the java.lang.System.setIn, 
> java.lang.System.setOut, and
> java.lang.System.setErr methods."
>
> I've attached a patch that (for me) has not caused any problems.  Does anyone 
> else have thoughts about this?
>
> cheers,
>
> jon
>
>> On Mon, Jun 28, 2010 at 07:14,  <jon.vanal...@redhat.com> wrote:
>> > Hello all,
>> >
>> > We've been having a discussion on the downstream IcedTea bugzilla
>> about a potential jdk bug, and it seems prudent to bring it up here.
>>  Link:
>> >
>> > http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=394
>> >
>> > Please ignore discussion there RE 32-bit *nix time overflow in 2038;
>> this is a glibc issue that Java cannot resolve.  What I am more
>> concerned about is the complete incompatibility with any negative
>> currentTimeMillis() return value.
>> >
>> > TL/DR: System class does a (currentTimeMillis() > 0) check as part
>> of method that only exists to avoid inlining of the initial null
>> assignment of the in/out/err streams.  So, if system time is before
>> January 1, 1970, java will not start.  The bug reporter has given
>> several potential use cases where this could occur (summary in comment
>> 14 of bug report).
>> >
>> > In my opinion, this is a bug.  The comment preceding the methods in
>> which this check occurs indicate that it is only to prevent inlining;
>> Java should not, IMO, care whether the system clock is set to 2367CE,
>> 2010, or 42BCE.  Provided, of course, that the date falls within the
>> 64 bit signed long value that the currentTimeMillis() method returns.
>>  In other words, I think that Java should not be concerned with
>> whether the system clock is in sync with real world time.
>> >
>> > I've tried changing the check to (currentTimeMillis() >=
>> Long.MIN_VALUE), to maintain the prevention of inlining while allowing
>> startup to proceed.  Patch attached.  This seems to work, in that when
>> system clock is before 1970 a program can actually start up.  There
>> does not seem to be unwanted side effects when running a few simple
>> programs, although I have not done any real regression testing.
>> >
>> > Is this something that others think should be fixed in the JDK?  Or
>> are Java users ultimately required to ensure that their system clock
>> is set accurately (and they are not time travelling hehe)?
>> >
>> > Related: I've been looking through other use of currentTimeMillis()
>> throughout the JDK, and I've found a few other places where there seem
>> to be assumptions made about the approximate expected return value.
>>  If others are of the same opinion that Java should be agnostic about
>> what a "sensible" system time should be, then I'll summarize my
>> findings in a future post.
>> >
>> > Your thoughts are appreciated.
>> >
>> > cheers,
>> >
>> > jon
>

Reply via email to