-
Notifications
You must be signed in to change notification settings - Fork 438
Add RLC-only SideEffectFree stubs and tests #7609
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 7 commits
77d5a28
e1d5221
22fac31
d72e909
4abfe12
5d5fd21
e8970a4
2806c28
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,32 @@ | ||
| package java.lang; | ||
|
|
||
| import java.io.PrintStream; | ||
| import java.io.PrintWriter; | ||
| import org.checkerframework.checker.lock.qual.GuardSatisfied; | ||
| import org.checkerframework.dataflow.qual.SideEffectFree; | ||
|
|
||
| public interface AutoCloseable { | ||
| @SideEffectFree | ||
| void close(@GuardSatisfied AutoCloseable this) throws Exception; | ||
| } | ||
|
|
||
| public class Throwable { | ||
| @SideEffectFree | ||
| public void printStackTrace(); | ||
|
|
||
| @SideEffectFree | ||
| public void printStackTrace(PrintStream s); | ||
|
|
||
| @SideEffectFree | ||
| public void printStackTrace(PrintWriter s); | ||
| } | ||
|
|
||
| package java.io; | ||
|
|
||
| import org.checkerframework.checker.lock.qual.GuardSatisfied; | ||
| import org.checkerframework.dataflow.qual.SideEffectFree; | ||
|
|
||
| public interface Closeable extends AutoCloseable { | ||
| @SideEffectFree | ||
| public void close(@GuardSatisfied Closeable this) throws IOException; | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,212 @@ | ||
| import org.checkerframework.dataflow.qual.SideEffectFree; | ||
|
|
||
| // Log4j 1.x API stubs (package org.apache.log4j). | ||
| package org.apache.log4j; | ||
|
|
||
| class Category { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/Category.html says that this class has been deprecated since at least 2003. (!) If you want to add log4j stubs, at least include the modern versions of the logging functions (i.e., in
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks, that makes sense. I removed the old |
||
| @SideEffectFree public void debug(Object message); | ||
| @SideEffectFree public void debug(Object message, Throwable t); | ||
| @SideEffectFree public void info(Object message); | ||
| @SideEffectFree public void info(Object message, Throwable t); | ||
| @SideEffectFree public void warn(Object message); | ||
| @SideEffectFree public void warn(Object message, Throwable t); | ||
| @SideEffectFree public void error(Object message); | ||
| @SideEffectFree public void error(Object message, Throwable t); | ||
| @SideEffectFree public void fatal(Object message); | ||
| @SideEffectFree public void fatal(Object message, Throwable t); | ||
| @SideEffectFree public void log(Priority priority, Object message); | ||
| @SideEffectFree public void log(Priority priority, Object message, Throwable t); | ||
| @SideEffectFree public void log(String callerFQCN, Priority level, Object message, Throwable t); | ||
| } | ||
|
|
||
| class Logger extends Category { | ||
| @SideEffectFree public void trace(Object message); | ||
| @SideEffectFree public void trace(Object message, Throwable t); | ||
| } | ||
|
Comment on lines
+6
to
+25
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial Add regressions for the newly stubbed overload families. The new tests only hit Also applies to: 32-212 🤖 Prompt for AI Agents
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried to cover representative samples from the stubs in the test cases, rather than adding test for every stub.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
|
|
||
| // Log4j 2.x API stubs (package org.apache.logging.log4j). | ||
| package org.apache.logging.log4j; | ||
|
|
||
| import org.apache.logging.log4j.message.Message; | ||
|
|
||
| interface Logger { | ||
| @SideEffectFree void trace(CharSequence message); | ||
| @SideEffectFree void trace(CharSequence message, Throwable throwable); | ||
| @SideEffectFree void trace(Object message); | ||
| @SideEffectFree void trace(Object message, Throwable throwable); | ||
| @SideEffectFree void trace(String message); | ||
| @SideEffectFree void trace(String message, Throwable throwable); | ||
| @SideEffectFree void trace(String message, Object p0); | ||
| @SideEffectFree void trace(String message, Object p0, Object p1); | ||
| @SideEffectFree void trace(String message, Object p0, Object p1, Object p2); | ||
| @SideEffectFree void trace(String message, Object p0, Object p1, Object p2, Object p3); | ||
| @SideEffectFree void trace( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4); | ||
| @SideEffectFree void trace( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5); | ||
| @SideEffectFree void trace( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6); | ||
| @SideEffectFree void trace( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7); | ||
| @SideEffectFree void trace( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8); | ||
| @SideEffectFree void trace( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8, Object p9); | ||
| @SideEffectFree void trace(String message, Object... params); | ||
| @SideEffectFree void trace(Message message); | ||
| @SideEffectFree void trace(Message message, Throwable throwable); | ||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| @SideEffectFree void debug(CharSequence message); | ||
| @SideEffectFree void debug(CharSequence message, Throwable throwable); | ||
| @SideEffectFree void debug(Object message); | ||
| @SideEffectFree void debug(Object message, Throwable throwable); | ||
| @SideEffectFree void debug(String message); | ||
| @SideEffectFree void debug(String message, Throwable throwable); | ||
| @SideEffectFree void debug(String message, Object p0); | ||
| @SideEffectFree void debug(String message, Object p0, Object p1); | ||
| @SideEffectFree void debug(String message, Object p0, Object p1, Object p2); | ||
| @SideEffectFree void debug(String message, Object p0, Object p1, Object p2, Object p3); | ||
| @SideEffectFree void debug( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4); | ||
| @SideEffectFree void debug( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5); | ||
| @SideEffectFree void debug( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6); | ||
| @SideEffectFree void debug( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7); | ||
| @SideEffectFree void debug( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8); | ||
| @SideEffectFree void debug( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8, Object p9); | ||
| @SideEffectFree void debug(String message, Object... params); | ||
| @SideEffectFree void debug(Message message); | ||
| @SideEffectFree void debug(Message message, Throwable throwable); | ||
|
|
||
| @SideEffectFree void info(CharSequence message); | ||
| @SideEffectFree void info(CharSequence message, Throwable throwable); | ||
| @SideEffectFree void info(Object message); | ||
| @SideEffectFree void info(Object message, Throwable throwable); | ||
| @SideEffectFree void info(String message); | ||
| @SideEffectFree void info(String message, Throwable throwable); | ||
| @SideEffectFree void info(String message, Object p0); | ||
| @SideEffectFree void info(String message, Object p0, Object p1); | ||
| @SideEffectFree void info(String message, Object p0, Object p1, Object p2); | ||
| @SideEffectFree void info(String message, Object p0, Object p1, Object p2, Object p3); | ||
| @SideEffectFree void info( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4); | ||
| @SideEffectFree void info( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5); | ||
| @SideEffectFree void info( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6); | ||
| @SideEffectFree void info( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7); | ||
| @SideEffectFree void info( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8); | ||
| @SideEffectFree void info( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8, Object p9); | ||
| @SideEffectFree void info(String message, Object... params); | ||
| @SideEffectFree void info(Message message); | ||
| @SideEffectFree void info(Message message, Throwable throwable); | ||
|
|
||
| @SideEffectFree void warn(CharSequence message); | ||
| @SideEffectFree void warn(CharSequence message, Throwable throwable); | ||
| @SideEffectFree void warn(Object message); | ||
| @SideEffectFree void warn(Object message, Throwable throwable); | ||
| @SideEffectFree void warn(String message); | ||
| @SideEffectFree void warn(String message, Throwable throwable); | ||
| @SideEffectFree void warn(String message, Object p0); | ||
| @SideEffectFree void warn(String message, Object p0, Object p1); | ||
| @SideEffectFree void warn(String message, Object p0, Object p1, Object p2); | ||
| @SideEffectFree void warn(String message, Object p0, Object p1, Object p2, Object p3); | ||
| @SideEffectFree void warn( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4); | ||
| @SideEffectFree void warn( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5); | ||
| @SideEffectFree void warn( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6); | ||
| @SideEffectFree void warn( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7); | ||
| @SideEffectFree void warn( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8); | ||
| @SideEffectFree void warn( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8, Object p9); | ||
| @SideEffectFree void warn(String message, Object... params); | ||
| @SideEffectFree void warn(Message message); | ||
| @SideEffectFree void warn(Message message, Throwable throwable); | ||
|
|
||
| @SideEffectFree void error(CharSequence message); | ||
| @SideEffectFree void error(CharSequence message, Throwable throwable); | ||
| @SideEffectFree void error(Object message); | ||
| @SideEffectFree void error(Object message, Throwable throwable); | ||
| @SideEffectFree void error(String message); | ||
| @SideEffectFree void error(String message, Throwable throwable); | ||
| @SideEffectFree void error(String message, Object p0); | ||
| @SideEffectFree void error(String message, Object p0, Object p1); | ||
| @SideEffectFree void error(String message, Object p0, Object p1, Object p2); | ||
| @SideEffectFree void error(String message, Object p0, Object p1, Object p2, Object p3); | ||
| @SideEffectFree void error( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4); | ||
| @SideEffectFree void error( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5); | ||
| @SideEffectFree void error( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6); | ||
| @SideEffectFree void error( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7); | ||
| @SideEffectFree void error( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8); | ||
| @SideEffectFree void error( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8, Object p9); | ||
| @SideEffectFree void error(String message, Object... params); | ||
| @SideEffectFree void error(Message message); | ||
| @SideEffectFree void error(Message message, Throwable throwable); | ||
|
|
||
| @SideEffectFree void fatal(CharSequence message); | ||
| @SideEffectFree void fatal(CharSequence message, Throwable throwable); | ||
| @SideEffectFree void fatal(Object message); | ||
| @SideEffectFree void fatal(Object message, Throwable throwable); | ||
| @SideEffectFree void fatal(String message); | ||
| @SideEffectFree void fatal(String message, Throwable throwable); | ||
| @SideEffectFree void fatal(String message, Object p0); | ||
| @SideEffectFree void fatal(String message, Object p0, Object p1); | ||
| @SideEffectFree void fatal(String message, Object p0, Object p1, Object p2); | ||
| @SideEffectFree void fatal(String message, Object p0, Object p1, Object p2, Object p3); | ||
| @SideEffectFree void fatal( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4); | ||
| @SideEffectFree void fatal( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5); | ||
| @SideEffectFree void fatal( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6); | ||
| @SideEffectFree void fatal( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7); | ||
| @SideEffectFree void fatal( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8); | ||
| @SideEffectFree void fatal( | ||
| String message, Object p0, Object p1, Object p2, Object p3, Object p4, Object p5, | ||
| Object p6, Object p7, Object p8, Object p9); | ||
| @SideEffectFree void fatal(String message, Object... params); | ||
| @SideEffectFree void fatal(Message message); | ||
| @SideEffectFree void fatal(Message message, Throwable throwable); | ||
| } | ||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| // RLC uses Called Methods facts to remember that a resource has already been closed. | ||
| // This test checks that the RLC-specific SideEffectFree stub for AutoCloseable.close() | ||
| // preserves those facts across another close call in the same destructor, rather than | ||
| // conservatively forgetting them after the first invocation. | ||
|
|
||
| import org.checkerframework.checker.calledmethods.qual.EnsuresCalledMethods; | ||
| import org.checkerframework.checker.mustcall.qual.Owning; | ||
|
|
||
| final class TestAutoCloseable implements AutoCloseable { | ||
| @Override | ||
| public void close() {} | ||
| } | ||
|
|
||
| class AutoCloseableClose implements AutoCloseable { | ||
| private @Owning AutoCloseable first = new TestAutoCloseable(); | ||
| private @Owning AutoCloseable second = new TestAutoCloseable(); | ||
|
|
||
| @Override | ||
| @EnsuresCalledMethods( | ||
| value = {"this.first", "this.second"}, | ||
| methods = "close") | ||
| public void close() { | ||
| try { | ||
| first.close(); | ||
| second.close(); | ||
| } catch (Exception e) { | ||
| throw new AssertionError(e); | ||
| } | ||
| } | ||
iamsanjaymalakar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| // RLC uses Called Methods facts to remember that a resource has already been closed. | ||
| // This test checks that the RLC-specific SideEffectFree stub for Closeable.close() | ||
| // preserves those facts across another close call in the same destructor, rather than | ||
| // conservatively forgetting them after the first invocation. | ||
|
|
||
| import java.io.Closeable; | ||
| import org.checkerframework.checker.calledmethods.qual.EnsuresCalledMethods; | ||
| import org.checkerframework.checker.mustcall.qual.Owning; | ||
|
|
||
| final class TestCloseable implements Closeable { | ||
| @Override | ||
| public void close() {} | ||
| } | ||
|
|
||
| class CloseableClose implements Closeable { | ||
| private @Owning Closeable first = new TestCloseable(); | ||
| private @Owning Closeable second = new TestCloseable(); | ||
|
|
||
| @Override | ||
| @EnsuresCalledMethods( | ||
| value = {"this.first", "this.second"}, | ||
| methods = "close") | ||
| public void close() { | ||
| try { | ||
| try { | ||
| first.close(); | ||
| } catch (Exception ignored) { | ||
| } | ||
| second.close(); | ||
| } catch (Exception e) { | ||
| throw new AssertionError(e); | ||
| } | ||
| } | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.