Re: Are there real use cases with the Java access modes?
Alex Otenko via Concurrency-interest <[email protected]> Thu, 22 Jul 2021 20:43:17 +0100
| Newsgroups | gmane.comp.java.jsr.166-concurrency |
|---|---|
| Message-ID | <CANkgWKic9VMMhtuiyDiej_qwSYWDXsFPzTehTFug1OivC+ZbKg@mail.gmail.com> |
JIT can speculate (as we've seen a spectacular example of recently) and recompile. This alone makes PMD's task intractable. Alex On Thu, 22 Jul 2021, 15:39 Nathan Reynolds, <[email protected]> wrote: > JIT has to decide if the loop condition can be hoisted. JIT halts the > hoisting optimization even on the world "full of nontrivial things"... and > if not the JIT team gets a bug to fix. Hence, I suspect JIT is > conservative on how deep it tries to examine to figure out if the condition > can be hoisted. I suspect that when JIT does not know what the destination > is (e.g. Runnable.run()), then it halts. > > So, the PMD rule needs to be at least as good as JIT at determining if the > variable can be hoisted. This will prevent unintentional infinite loops at > run time. If the PMD rule is better than JIT, then that is just a bonus > for the programmer. I suspect the PMD rule can be better than JIT. If I > understand correctly, JIT is limited to looking at what is inlined due to > runtime constraints. PMD can has the time to go much deeper. Also, if the > loop calls Runnable.run(), then PMD can look at all classes that implement > Runnable. Yes, this will mean false negatives, but as long as it is better > than JIT who cares. > > If the PMD rule cannot be as good as JIT, then the PMD rule will catch > most unintentional infinite loops and has a few false negatives for the > nontrivial things. This is much better than no PMD rule. However, for > those that use Graal, the PMD rule can be just as good as Graal since Graal > produces a single executable (i.e. a closed system). > > On Thu, Jul 22, 2021 at 7:38 AM Alex Otenko <[email protected]> > wrote: > >> I think the problem is still the halting problem. You only have the text >> of the program, and you need to decide not only that quit=true exists, but >> that it is reachable from the loop body. >> >> There are trivial cases where you can do this, but the world is full of >> nontrivial things. Say, createRandom...NP sets quit=true. Now what? Say, a >> subclass overrides createRandom...NP. Now what? Say, you call someone that >> has reference to this, and calls createRandom...NP. Now what? Is it the >> same instance or not? >> >> Etc, etc, etc >> >> The bottom line is: often there is no simple answer to a complex problem, >> and infinitely often there is no answer. >> >> Alex >> >> >> On Thu, 22 Jul 2021, 13:46 Nathan Reynolds via Concurrency-interest, < >> [email protected]> wrote: >> >>> It is not quite the halting problem. The halting problem asks if the >>> computation ends. The PMD rule asks if among the many branches inside the >>> loop's call tree if the exit variable is set. It does not care if the >>> branch is never taken. >>> >>> Consider this code... >>> >>> private boolean quit; >>> >>> while (!quit) >>> { >>> createRandomAlgorithmInPforNP(); >>> >>> if (doesAlgorithmWork()) >>> { >>> quit = true; >>> } >>> } >>> >>> The method createRandomAlgorithmInPforNP() creates a random algorithm >>> that runs in polynomial time and hopefully solves a NP problem. The method >>> doesAlgorithmWork() tests the created algorithm to see if it works. This >>> is an example of a halting problem. We don't 100% know if an algorithm >>> will ever be found and hence if the loop will run forever. >>> >>> But, this does not matter for the PMD rule. The PMD rule only cares >>> that there is a "quit = true" in the loop body (or in the call tree). >>> Why? The PMD rule is looking to see if "while (!quit)" can be hoisted out >>> of the loop thus creating an infinite loop. It will execute the same logic >>> that JIT does to determine if "while (!quit)" can be hoisted. We have >>> working code (i.e. JIT) that we can use to implement the PMD rule. >>> >>> On Thu, Jul 22, 2021 at 2:35 AM Andrew Haley via Concurrency-interest < >>> [email protected]> wrote: >>> >>>> On 7/21/21 4:50 PM, Nathan Reynolds via Concurrency-interest wrote: >>>> >>>> > Sounds like a job for a linter. For easier cases, an easy PMD rule >>>> > will catch such a problem. For harder cases, the PMD rule will need >>>> > to traverse the call tree to see if a thread executing the loop >>>> > could change the field. If not, flag a problem to the programmer. >>>> >>>> I suspect that getting this right (no false positives or negatives) is >>>> equivalent to the halting problem, i.e. it's uncomputable. The best >>>> you can say is that if an expression used as the exit condition of a >>>> loop has a term hoisted from memory, the loop might not terminate. >>>> >>>> However, while linting for that provides some information to the naive >>>> programmer, it "solves" the problem of infinite loops but ignores >>>> silently returning false results. >>>> >>>> -- >>>> Andrew Haley (he/him) >>>> Java Platform Lead Engineer >>>> Red Hat UK Ltd. <https://www.redhat.com> >>>> https://keybase.io/andrewhaley >>>> EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671 >>>> >>>> _______________________________________________ >>>> Concurrency-interest mailing list >>>> [email protected] >>>> http://cs.oswego.edu/mailman/listinfo/concurrency-interest >>>> >>> _______________________________________________ >>> Concurrency-interest mailing list >>> [email protected] >>> http://cs.oswego.edu/mailman/listinfo/concurrency-interest >>> >> _______________________________________________ Concurrency-interest mailing list [email protected] http://cs.oswego.edu/mailman/listinfo/concurrency-interest