From 7ac8bf6c751ee7e902a6024d30b8a28ff9b047d3 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 18 Oct 2016 16:00:32 +0200 Subject: [PATCH 1/8] 8167461: jshell tool: Scanner#next() hangs tool PipeInputStream.read(byte[]...) should only read available bytes; properly resending exceptions for snippet's System.in and properly closing it; more reliable way to cancel user input while waiting in System.in. Reviewed-by: rfield --- .../jshell/tool/ConsoleIOContext.java | 9 +-- .../jdk/internal/jshell/tool/IOContext.java | 2 +- .../share/classes/jdk/jshell/JShell.java | 5 ++ .../jdk/jshell/execution/PipeInputStream.java | 28 +++++++- .../classes/jdk/jshell/execution/Util.java | 60 +++++++++++++++- langtools/test/jdk/jshell/KullaTesting.java | 31 ++++++-- .../test/jdk/jshell/PipeInputStreamTest.java | 71 +++++++++++++++++++ langtools/test/jdk/jshell/UserInputTest.java | 62 +++++++++++++++- 8 files changed, 251 insertions(+), 17 deletions(-) create mode 100644 langtools/test/jdk/jshell/PipeInputStreamTest.java diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java index b4df8efbe54..f11c1beb7cc 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/ConsoleIOContext.java @@ -31,6 +31,7 @@ import jdk.jshell.SourceCodeAnalysis.Suggestion; import java.awt.event.ActionListener; import java.io.IOException; import java.io.InputStream; +import java.io.InterruptedIOException; import java.io.PrintStream; import java.io.UncheckedIOException; import java.lang.reflect.Method; @@ -390,7 +391,7 @@ class ConsoleIOContext extends IOContext { private int inputBytesPointer; @Override - public synchronized int readUserInput() { + public synchronized int readUserInput() throws IOException { while (inputBytes == null || inputBytes.length <= inputBytesPointer) { boolean prevHandleUserInterrupt = in.getHandleUserInterrupt(); History prevHistory = in.getHistory(); @@ -401,12 +402,8 @@ class ConsoleIOContext extends IOContext { in.setHistory(userInputHistory); inputBytes = (in.readLine("") + System.getProperty("line.separator")).getBytes(); inputBytesPointer = 0; - } catch (IOException ex) { - ex.printStackTrace(); - return -1; } catch (UserInterruptException ex) { - repl.state.stop(); - return -1; + throw new InterruptedIOException(); } finally { in.setHistory(prevHistory); in.setHandleUserInterrupt(prevHandleUserInterrupt); diff --git a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/IOContext.java b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/IOContext.java index 4f4a51a44b0..91a2169fcf0 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/IOContext.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/internal/jshell/tool/IOContext.java @@ -54,7 +54,7 @@ abstract class IOContext implements AutoCloseable { public abstract void replaceLastHistoryEntry(String source); - public abstract int readUserInput(); + public abstract int readUserInput() throws IOException; class InputInterruptedException extends Exception { private static final long serialVersionUID = 1L; diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java index e45ec1b35fd..aa2dfeef901 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/JShell.java @@ -28,6 +28,7 @@ package jdk.jshell; import jdk.jshell.spi.ExecutionControl; import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.io.InterruptedIOException; import java.io.PrintStream; import java.text.MessageFormat; import java.util.ArrayList; @@ -167,6 +168,10 @@ public class JShell implements AutoCloseable { * user input cannot use {@code System.in} as the input stream for * the remote process. *

+ * The {@code read} method of the {@code InputStream} may throw the {@link InterruptedIOException} + * to signal the user canceled the input. The currently running snippet will be automatically + * {@link JShell#stop() stopped}. + *

* The default, if this is not set, is to provide an empty input stream * -- {@code new ByteArrayInputStream(new byte[0])}. * diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/PipeInputStream.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/PipeInputStream.java index 1b582fa9b10..c0553305119 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/PipeInputStream.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/PipeInputStream.java @@ -42,7 +42,7 @@ class PipeInputStream extends InputStream { @Override public synchronized int read() throws IOException { - if (start == end) { + if (start == end && !closed) { inputNeeded(); } while (start == end) { @@ -62,6 +62,32 @@ class PipeInputStream extends InputStream { } } + @Override + public synchronized int read(byte[] b, int off, int len) throws IOException { + if (b == null) { + throw new NullPointerException(); + } else if (off < 0 || len < 0 || len > b.length - off) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } + + int c = read(); + if (c == -1) { + return -1; + } + b[off] = (byte)c; + + int totalRead = 1; + while (totalRead < len && start != end) { + int r = read(); + if (r == (-1)) + break; + b[off + totalRead++] = (byte) r; + } + return totalRead; + } + protected void inputNeeded() throws IOException {} private synchronized void write(int b) { diff --git a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java index da8decab065..3ea2975ca56 100644 --- a/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java +++ b/langtools/src/jdk.jshell/share/classes/jdk/jshell/execution/Util.java @@ -28,6 +28,7 @@ import jdk.jshell.spi.ExecutionEnv; import java.io.IOException; import java.io.InputStream; +import java.io.InterruptedIOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; @@ -42,6 +43,7 @@ import java.util.function.Consumer; import com.sun.jdi.VirtualMachine; import jdk.jshell.spi.ExecutionControl; +import jdk.jshell.spi.ExecutionControl.ExecutionControlException; /** @@ -54,6 +56,10 @@ import jdk.jshell.spi.ExecutionControl; */ public class Util { + private static final int TAG_DATA = 0; + private static final int TAG_CLOSED = 1; + private static final int TAG_EXCEPTION = 2; + // never instanciated private Util() {} @@ -131,6 +137,25 @@ public class Util { inputSignal.write('1'); inputSignal.flush(); } + @Override + public synchronized int read() throws IOException { + int tag = super.read(); + switch (tag) { + case TAG_DATA: return super.read(); + case TAG_CLOSED: close(); return -1; + case TAG_EXCEPTION: + int len = (super.read() << 0) + (super.read() << 8) + (super.read() << 16) + (super.read() << 24); + byte[] message = new byte[len]; + for (int i = 0; i < len; i++) { + message[i] = (byte) super.read(); + } + throw new IOException(new String(message, "UTF-8")); + case -1: + return -1; + default: + throw new IOException("Internal error: unrecognized message tag: " + tag); + } + } }; inputs.put(e.getKey(), inputPipe.createOutput()); e.getValue().accept(inputPipe); @@ -163,6 +188,7 @@ public class Util { public static ExecutionControl remoteInputOutput(InputStream input, OutputStream output, Map outputStreamMap, Map inputStreamMap, BiFunction factory) throws IOException { + ExecutionControl[] result = new ExecutionControl[1]; Map augmentedStreamMap = new HashMap<>(outputStreamMap); ObjectOutput commandOut = new ObjectOutputStream(Util.multiplexingOutputStream("$command", output)); for (Entry e : inputStreamMap.entrySet()) { @@ -172,7 +198,28 @@ public class Util { @Override public void write(int b) throws IOException { //value ignored, just a trigger to read from the input - inTarget.write(in.read()); + try { + int r = in.read(); + if (r == (-1)) { + inTarget.write(TAG_CLOSED); + } else { + inTarget.write(new byte[] {TAG_DATA, (byte) r}); + } + } catch (InterruptedIOException exc) { + try { + result[0].stop(); + } catch (ExecutionControlException ex) { + debug(ex, "$" + e.getKey() + "-input-requested.write"); + } + } catch (IOException exc) { + byte[] message = exc.getMessage().getBytes("UTF-8"); + inTarget.write(TAG_EXCEPTION); + inTarget.write((message.length >> 0) & 0xFF); + inTarget.write((message.length >> 8) & 0xFF); + inTarget.write((message.length >> 16) & 0xFF); + inTarget.write((message.length >> 24) & 0xFF); + inTarget.write(message); + } } }); } @@ -180,7 +227,7 @@ public class Util { OutputStream commandInTarget = commandIn.createOutput(); augmentedStreamMap.put("$command", commandInTarget); new DemultiplexInput(input, augmentedStreamMap, Arrays.asList(commandInTarget)).start(); - return factory.apply(new ObjectInputStream(commandIn), commandOut); + return result[0] = factory.apply(new ObjectInputStream(commandIn), commandOut); } /** @@ -198,4 +245,13 @@ public class Util { } } + /** + * Log a serious unexpected internal exception. + * + * @param ex the exception + * @param where a description of the context of the exception + */ + private static void debug(Throwable ex, String where) { + // Reserved for future logging + } } diff --git a/langtools/test/jdk/jshell/KullaTesting.java b/langtools/test/jdk/jshell/KullaTesting.java index 1cf81441acb..9e73bd7fcf0 100644 --- a/langtools/test/jdk/jshell/KullaTesting.java +++ b/langtools/test/jdk/jshell/KullaTesting.java @@ -21,7 +21,10 @@ * questions. */ +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.io.PrintStream; import java.io.StringWriter; import java.lang.reflect.Method; @@ -83,7 +86,7 @@ public class KullaTesting { private SourceCodeAnalysis analysis = null; private JShell state = null; - private TestingInputStream inStream = null; + private InputStream inStream = null; private ByteArrayOutputStream outStream = null; private ByteArrayOutputStream errStream = null; @@ -106,7 +109,11 @@ public class KullaTesting { } public void setInput(String s) { - inStream.setInput(s); + setInput(new ByteArrayInputStream(s.getBytes())); + } + + public void setInput(InputStream in) { + inStream = in; } public String getOutput() { @@ -159,11 +166,27 @@ public class KullaTesting { } public void setUp(Consumer bc) { - inStream = new TestingInputStream(); + InputStream in = new InputStream() { + @Override + public int read() throws IOException { + assertNotNull(inStream); + return inStream.read(); + } + @Override + public int read(byte[] b) throws IOException { + assertNotNull(inStream); + return inStream.read(b); + } + @Override + public int read(byte[] b, int off, int len) throws IOException { + assertNotNull(inStream); + return inStream.read(b, off, len); + } + }; outStream = new ByteArrayOutputStream(); errStream = new ByteArrayOutputStream(); JShell.Builder builder = JShell.builder() - .in(inStream) + .in(in) .out(new PrintStream(outStream)) .err(new PrintStream(errStream)); bc.accept(builder); diff --git a/langtools/test/jdk/jshell/PipeInputStreamTest.java b/langtools/test/jdk/jshell/PipeInputStreamTest.java new file mode 100644 index 00000000000..c062028e3ba --- /dev/null +++ b/langtools/test/jdk/jshell/PipeInputStreamTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test 8167461 + * @summary Verify PipeInputStream works. + * @modules jdk.compiler/com.sun.tools.javac.util + * jdk.jshell + * @run testng PipeInputStreamTest + */ + +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +import org.testng.annotations.Test; + +import com.sun.tools.javac.util.Pair; + +import static org.testng.Assert.*; + +@Test +public class PipeInputStreamTest { + + public void testReadArrayNotBlocking() throws Exception { + Pair streams = createPipeStream(); + InputStream in = streams.fst; + OutputStream out = streams.snd; + out.write('a'); + byte[] data = new byte[12]; + assertEquals(in.read(data), 1); + assertEquals(data[0], 'a'); + out.write('a'); out.write('b'); out.write('c'); + assertEquals(in.read(data), 3); + assertEquals(data[0], 'a'); + assertEquals(data[1], 'b'); + assertEquals(data[2], 'c'); + } + + private Pair createPipeStream() throws Exception { + Class pipeStreamClass = Class.forName("jdk.jshell.execution.PipeInputStream"); + Constructor c = pipeStreamClass.getDeclaredConstructor(); + c.setAccessible(true); + Object pipeStream = c.newInstance(); + Method createOutputStream = pipeStreamClass.getDeclaredMethod("createOutput"); + createOutputStream.setAccessible(true); + return Pair.of((InputStream) pipeStream, (OutputStream) createOutputStream.invoke(pipeStream)); + } + +} diff --git a/langtools/test/jdk/jshell/UserInputTest.java b/langtools/test/jdk/jshell/UserInputTest.java index 5289ab7c56b..41221c009dc 100644 --- a/langtools/test/jdk/jshell/UserInputTest.java +++ b/langtools/test/jdk/jshell/UserInputTest.java @@ -23,12 +23,15 @@ /* * @test - * @bug 8131023 + * @bug 8131023 8167461 * @summary Verify that the user's code can read System.in * @build KullaTesting TestingInputStream * @run testng UserInputTest */ +import java.io.IOException; +import java.io.InputStream; + import org.testng.annotations.Test; @Test @@ -37,8 +40,61 @@ public class UserInputTest extends KullaTesting { public void testReadInput() { setInput("AB\n"); assertEval("System.in.read()", "65"); - setInput("BC\n"); - assertEval("System.in.read()", "66"); + setInput("CD\n"); + assertEval("System.in.read()", "67"); } + public void testScanner() { + assertEval("import java.util.Scanner;"); + assertEval("Scanner s = new Scanner(System.in);"); + setInput("12\n"); + assertEval("s.nextInt();", "12"); + } + + public void testClose() { + setInput(new InputStream() { + private final byte[] data = new byte[] {0, 1, 2}; + private int cursor; + @Override public int read() throws IOException { + if (cursor < data.length) { + return data[cursor++]; + } else { + return -1; + } + } + }); + assertEval("int read;", "0"); + assertEval("System.in.read();", "0"); + assertEval("System.in.read();", "1"); + assertEval("System.in.read();", "2"); + assertEval("System.in.read();", "-1"); + assertEval("System.in.read();", "-1"); + assertEval("System.in.read();", "-1"); + } + + public void testException() { + setInput(new InputStream() { + private final int[] data = new int[] {0, 1, -2, 2}; + private int cursor; + @Override public int read() throws IOException { + if (cursor < data.length) { + int d = data[cursor++]; + if (d == (-2)) { + throw new IOException("Crashed"); + } + return d; + } else { + return -1; + } + } + }); + assertEval("int read;", "0"); + assertEval("System.in.read();", "0"); + assertEval("System.in.read();", "1"); + assertEval("java.io.IOException e;"); + assertEval("try { System.in.read(); } catch (java.io.IOException exc) { e = exc; }"); + assertEval("e", "java.io.IOException: Crashed"); + assertEval("System.in.read();", "2"); + assertEval("System.in.read();", "-1"); + } } From d13040370481e50572140498c8d7292040b1b94e Mon Sep 17 00:00:00 2001 From: Vicente Romero Date: Wed, 2 Mar 2016 18:25:01 -0500 Subject: [PATCH 2/8] 8026721: Enhance Lambda serialization Reviewed-by: jjg, briangoetz --- .../com/sun/tools/javac/comp/Attr.java | 7 +- .../com/sun/tools/javac/comp/AttrContext.java | 10 ++- .../com/sun/tools/javac/comp/Check.java | 32 ++++++++-- .../tools/javac/resources/compiler.properties | 8 ++- .../tools/javac/resources/javac.properties | 3 +- ....java => WarnSerializableElementTest.java} | 64 +++++++++---------- .../T8029102/WarnSerializableElementTest.out | 35 ++++++++++ .../T8029102/WarnSerializableLambdaTest.out | 57 ----------------- .../T8029102/WarnSerializableLambdaTestb.java | 2 +- .../T8029102/WarnSerializableLambdaTestb.out | 8 +-- .../T8029102/WarnSerializableLambdaTestc.java | 20 ++++++ .../T8029102/WarnSerializableLambdaTestc.out | 4 ++ .../tools/javac/diags/CheckResourceKeys.java | 2 + .../tools/javac/diags/examples.not-yet.txt | 1 + .../examples/WarnSerializableLambda.java | 21 +++--- 15 files changed, 155 insertions(+), 119 deletions(-) rename langtools/test/tools/javac/T8029102/{WarnSerializableLambdaTest.java => WarnSerializableElementTest.java} (71%) create mode 100644 langtools/test/tools/javac/T8029102/WarnSerializableElementTest.out delete mode 100644 langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.out create mode 100644 langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.java create mode 100644 langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.out diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index 2743702d11d..3aee3c44504 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -2398,6 +2398,7 @@ public class Attr extends JCTree.Visitor { try { if (needsRecovery && isSerializable(pt())) { localEnv.info.isSerializable = true; + localEnv.info.isLambda = true; } List explicitParamTypes = null; if (that.paramKind == JCLambda.ParameterKind.EXPLICIT) { @@ -2969,7 +2970,7 @@ public class Attr extends JCTree.Visitor { } if (isTargetSerializable) { - chk.checkElemAccessFromSerializableLambda(that); + chk.checkAccessFromSerializableElement(that, true); } } @@ -3364,7 +3365,7 @@ public class Attr extends JCTree.Visitor { } if (env.info.isSerializable) { - chk.checkElemAccessFromSerializableLambda(tree); + chk.checkAccessFromSerializableElement(tree, env.info.isLambda); } result = checkId(tree, env1.enclClass.sym.type, sym, env, resultInfo); @@ -3507,7 +3508,7 @@ public class Attr extends JCTree.Visitor { } if (env.info.isSerializable) { - chk.checkElemAccessFromSerializableLambda(tree); + chk.checkAccessFromSerializableElement(tree, env.info.isLambda); } env.info.selectSuper = selectSuperPrev; diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/AttrContext.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/AttrContext.java index 368efd19db1..573e8948136 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/AttrContext.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/AttrContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,10 +56,15 @@ public class AttrContext { */ boolean selectSuper = false; - /** Is the current target of lambda expression or method reference serializable? + /** Is the current target of lambda expression or method reference serializable or is this a + * serializable class? */ boolean isSerializable = false; + /** Is this a lambda environment? + */ + boolean isLambda = false; + /** Is this a speculative attribution environment? */ boolean isSpeculative = false; @@ -117,6 +122,7 @@ public class AttrContext { info.returnResult = returnResult; info.defaultSuperCallSite = defaultSuperCallSite; info.isSerializable = isSerializable; + info.isLambda = isLambda; info.isSpeculative = isSpeculative; info.isAnonymousDiamond = isAnonymousDiamond; info.isNewClass = isNewClass; diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java index 1a774450eac..038326f974f 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java @@ -87,7 +87,7 @@ public class Check { private final JavaFileManager fileManager; private final Source source; private final Profile profile; - private final boolean warnOnAccessToSensitiveMembers; + private final boolean warnOnAnyAccessToMembers; // The set of lint options currently in effect. It is initialized // from the context, and then is set/reset as needed by Attr as it @@ -131,7 +131,7 @@ public class Check { allowStrictMethodClashCheck = source.allowStrictMethodClashCheck(); allowPrivateSafeVarargs = source.allowPrivateSafeVarargs(); allowDiamondWithAnonymousClassCreation = source.allowDiamondWithAnonymousClassCreation(); - warnOnAccessToSensitiveMembers = options.isSet("warnOnAccessToSensitiveMembers"); + warnOnAnyAccessToMembers = options.isSet("warnOnAccessToMembers"); Target target = Target.instance(context); syntheticNameChar = target.syntheticNameChar(); @@ -2605,8 +2605,11 @@ public class Check { } } - void checkElemAccessFromSerializableLambda(final JCTree tree) { - if (warnOnAccessToSensitiveMembers) { + void checkAccessFromSerializableElement(final JCTree tree, boolean isLambda) { + if (warnOnAnyAccessToMembers || + (lint.isEnabled(LintCategory.SERIAL) && + !lint.isSuppressed(LintCategory.SERIAL) && + isLambda)) { Symbol sym = TreeInfo.symbol(tree); if (!sym.kind.matches(KindSelector.VAL_MTH)) { return; @@ -2622,9 +2625,16 @@ public class Check { } if (!types.isSubtype(sym.owner.type, syms.serializableType) && - isEffectivelyNonPublic(sym)) { - log.warning(tree.pos(), - "access.to.sensitive.member.from.serializable.element", sym); + isEffectivelyNonPublic(sym)) { + if (isLambda) { + if (belongsToRestrictedPackage(sym)) { + log.warning(LintCategory.SERIAL, tree.pos(), + "access.to.member.from.serializable.lambda", sym); + } + } else { + log.warning(tree.pos(), + "access.to.member.from.serializable.element", sym); + } } } } @@ -2643,6 +2653,14 @@ public class Check { return false; } + private boolean belongsToRestrictedPackage(Symbol sym) { + String fullName = sym.packge().fullname.toString(); + return fullName.startsWith("java.") || + fullName.startsWith("javax.") || + fullName.startsWith("sun.") || + fullName.contains(".internal."); + } + /** Report a conflict between a user symbol and a synthetic symbol. */ private void syntheticError(DiagnosticPosition pos, Symbol sym) { diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties index f183212aa70..152c94d0f5a 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -1712,8 +1712,12 @@ compiler.warn.varargs.redundant.trustme.anno=\ Redundant {0} annotation. {1} # 0: symbol -compiler.warn.access.to.sensitive.member.from.serializable.element=\ - access to sensitive member {0} from serializable element can be publicly accessible to untrusted code +compiler.warn.access.to.member.from.serializable.element=\ + access to member {0} from serializable element can be publicly accessible to untrusted code + +# 0: symbol +compiler.warn.access.to.member.from.serializable.lambda=\ + access to member {0} from serializable lambda can be publicly accessible to untrusted code ##### diff --git a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties index 44634e703e0..93f34ce7d1e 100644 --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/javac.properties @@ -220,7 +220,8 @@ javac.opt.Xlint.desc.rawtypes=\ Warn about use of raw types. javac.opt.Xlint.desc.serial=\ - Warn about Serializable classes that do not provide a serial version ID. + Warn about Serializable classes that do not provide a serial version ID. \n\ +\ Also warn about access to non-public members from a serializable element. javac.opt.Xlint.desc.static=\ Warn about accessing a static member using an instance. diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.java b/langtools/test/tools/javac/T8029102/WarnSerializableElementTest.java similarity index 71% rename from langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.java rename to langtools/test/tools/javac/T8029102/WarnSerializableElementTest.java index ac377a93c3c..7f190fca10f 100644 --- a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.java +++ b/langtools/test/tools/javac/T8029102/WarnSerializableElementTest.java @@ -4,36 +4,36 @@ * @summary Enhance compiler warnings for Lambda * Checks that the warning for accessing non public members of a class is * fired correctly. - * @compile/fail/ref=WarnSerializableLambdaTest.out -XDrawDiagnostics -Werror -XDwarnOnAccessToSensitiveMembers WarnSerializableLambdaTest.java + * @compile/fail/ref=WarnSerializableElementTest.out -XDrawDiagnostics -Werror -XDwarnOnAccessToMembers WarnSerializableElementTest.java */ import java.io.Serializable; -public class WarnSerializableLambdaTest { +public class WarnSerializableElementTest { void warnLambda() throws Exception { - SAM t3 = (SAM & Serializable)WarnSerializableLambdaTest::packageClassMethod; - SAM t4 = (SAM & Serializable)WarnSerializableLambdaTest::protectedClassMethod; - SAM t5 = (SAM & Serializable)WarnSerializableLambdaTest::privateClassMethod; + SAM t3 = (SAM & Serializable)WarnSerializableElementTest::packageClassMethod; + SAM t4 = (SAM & Serializable)WarnSerializableElementTest::protectedClassMethod; + SAM t5 = (SAM & Serializable)WarnSerializableElementTest::privateClassMethod; - WarnSerializableLambdaTest test = new WarnSerializableLambdaTest(); + WarnSerializableElementTest test = new WarnSerializableElementTest(); SAM t6 = (SAM & Serializable)test::packageInstanceMethod; SAM t7 = (SAM & Serializable)test::protectedInstanceMethod; SAM t8 = (SAM & Serializable)test::privateInstanceMethod; SAM t9 = (SAM & Serializable) c -> { - WarnSerializableLambdaTest.staticPackageField = ""; - WarnSerializableLambdaTest.staticProtectedField = ""; - WarnSerializableLambdaTest.staticPrivateField = ""; + WarnSerializableElementTest.staticPackageField = ""; + WarnSerializableElementTest.staticProtectedField = ""; + WarnSerializableElementTest.staticPrivateField = ""; packageField = ""; protectedField = ""; privateField = ""; - WarnSerializableLambdaTest.packageClassMethod(null); - WarnSerializableLambdaTest.protectedClassMethod(null); - WarnSerializableLambdaTest.privateClassMethod(null); + WarnSerializableElementTest.packageClassMethod(null); + WarnSerializableElementTest.protectedClassMethod(null); + WarnSerializableElementTest.privateClassMethod(null); packageInstanceMethod(null); protectedInstanceMethod(null); @@ -53,17 +53,17 @@ public class WarnSerializableLambdaTest { private void warnAnoInnerClass() throws Exception { new SerializableDesc() { public void m(Object param) throws Exception { - WarnSerializableLambdaTest.staticPackageField = ""; - WarnSerializableLambdaTest.staticProtectedField = ""; - WarnSerializableLambdaTest.staticPrivateField = ""; + WarnSerializableElementTest.staticPackageField = ""; + WarnSerializableElementTest.staticProtectedField = ""; + WarnSerializableElementTest.staticPrivateField = ""; packageField = ""; protectedField = ""; privateField = ""; - WarnSerializableLambdaTest.packageClassMethod(null); - WarnSerializableLambdaTest.protectedClassMethod(null); - WarnSerializableLambdaTest.privateClassMethod(null); + WarnSerializableElementTest.packageClassMethod(null); + WarnSerializableElementTest.protectedClassMethod(null); + WarnSerializableElementTest.privateClassMethod(null); packageInstanceMethod(null); protectedInstanceMethod(null); @@ -80,9 +80,9 @@ public class WarnSerializableLambdaTest { } void dontWarnLambda() throws Exception { - SAM t1 = (SAM & Serializable)WarnSerializableLambdaTest::publicClassMethod; + SAM t1 = (SAM & Serializable)WarnSerializableElementTest::publicClassMethod; - WarnSerializableLambdaTest test = new WarnSerializableLambdaTest(); + WarnSerializableElementTest test = new WarnSerializableElementTest(); SAM t2 = (SAM & Serializable)test::publicInstanceMethod; int[] buffer = {0}; @@ -92,9 +92,9 @@ public class WarnSerializableLambdaTest { localVar = null; param = null; - WarnSerializableLambdaTest.staticPublicField = ""; + WarnSerializableElementTest.staticPublicField = ""; publicField = ""; - WarnSerializableLambdaTest.publicClassMethod(null); + WarnSerializableElementTest.publicClassMethod(null); publicInstanceMethod(null); PublicClass.effectivelyPublicStaticField = ""; @@ -118,9 +118,9 @@ public class WarnSerializableLambdaTest { localVar = null; param = null; - WarnSerializableLambdaTest.staticPublicField = ""; + WarnSerializableElementTest.staticPublicField = ""; publicField = ""; - WarnSerializableLambdaTest.publicClassMethod(null); + WarnSerializableElementTest.publicClassMethod(null); publicInstanceMethod(null); PublicClass.effectivelyPublicStaticField = ""; @@ -138,20 +138,20 @@ public class WarnSerializableLambdaTest { enum WarnEnum { A { public void m() throws Exception { - WarnSerializableLambdaTest.staticPackageField = ""; - WarnSerializableLambdaTest.staticProtectedField = ""; - WarnSerializableLambdaTest.staticPrivateField = ""; + WarnSerializableElementTest.staticPackageField = ""; + WarnSerializableElementTest.staticProtectedField = ""; + WarnSerializableElementTest.staticPrivateField = ""; - WarnSerializableLambdaTest test = - new WarnSerializableLambdaTest(); + WarnSerializableElementTest test = + new WarnSerializableElementTest(); test.packageField = ""; test.protectedField = ""; test.privateField = ""; - WarnSerializableLambdaTest.packageClassMethod(null); - WarnSerializableLambdaTest.protectedClassMethod(null); - WarnSerializableLambdaTest.privateClassMethod(null); + WarnSerializableElementTest.packageClassMethod(null); + WarnSerializableElementTest.protectedClassMethod(null); + WarnSerializableElementTest.privateClassMethod(null); test.packageInstanceMethod(null); test.protectedInstanceMethod(null); diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableElementTest.out b/langtools/test/tools/javac/T8029102/WarnSerializableElementTest.out new file mode 100644 index 00000000000..3328e4a0e3c --- /dev/null +++ b/langtools/test/tools/javac/T8029102/WarnSerializableElementTest.out @@ -0,0 +1,35 @@ +WarnSerializableElementTest.java:56:44: compiler.warn.access.to.member.from.serializable.element: staticPackageField +WarnSerializableElementTest.java:57:44: compiler.warn.access.to.member.from.serializable.element: staticProtectedField +WarnSerializableElementTest.java:58:44: compiler.warn.access.to.member.from.serializable.element: staticPrivateField +WarnSerializableElementTest.java:60:17: compiler.warn.access.to.member.from.serializable.element: packageField +WarnSerializableElementTest.java:61:17: compiler.warn.access.to.member.from.serializable.element: protectedField +WarnSerializableElementTest.java:62:17: compiler.warn.access.to.member.from.serializable.element: privateField +WarnSerializableElementTest.java:64:44: compiler.warn.access.to.member.from.serializable.element: packageClassMethod(java.lang.String) +WarnSerializableElementTest.java:65:44: compiler.warn.access.to.member.from.serializable.element: protectedClassMethod(java.lang.String) +WarnSerializableElementTest.java:66:44: compiler.warn.access.to.member.from.serializable.element: privateClassMethod(java.lang.String) +WarnSerializableElementTest.java:68:17: compiler.warn.access.to.member.from.serializable.element: packageInstanceMethod(java.lang.String) +WarnSerializableElementTest.java:69:17: compiler.warn.access.to.member.from.serializable.element: protectedInstanceMethod(java.lang.String) +WarnSerializableElementTest.java:70:17: compiler.warn.access.to.member.from.serializable.element: privateInstanceMethod(java.lang.String) +WarnSerializableElementTest.java:72:29: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicStaticField +WarnSerializableElementTest.java:73:29: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicClassMethod() +WarnSerializableElementTest.java:76:18: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicInstanceField +WarnSerializableElementTest.java:77:18: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicInstanceMethod() +WarnSerializableElementTest.java:141:44: compiler.warn.access.to.member.from.serializable.element: staticPackageField +WarnSerializableElementTest.java:142:44: compiler.warn.access.to.member.from.serializable.element: staticProtectedField +WarnSerializableElementTest.java:143:44: compiler.warn.access.to.member.from.serializable.element: staticPrivateField +WarnSerializableElementTest.java:148:21: compiler.warn.access.to.member.from.serializable.element: packageField +WarnSerializableElementTest.java:149:21: compiler.warn.access.to.member.from.serializable.element: protectedField +WarnSerializableElementTest.java:150:21: compiler.warn.access.to.member.from.serializable.element: privateField +WarnSerializableElementTest.java:152:44: compiler.warn.access.to.member.from.serializable.element: packageClassMethod(java.lang.String) +WarnSerializableElementTest.java:153:44: compiler.warn.access.to.member.from.serializable.element: protectedClassMethod(java.lang.String) +WarnSerializableElementTest.java:154:44: compiler.warn.access.to.member.from.serializable.element: privateClassMethod(java.lang.String) +WarnSerializableElementTest.java:156:21: compiler.warn.access.to.member.from.serializable.element: packageInstanceMethod(java.lang.String) +WarnSerializableElementTest.java:157:21: compiler.warn.access.to.member.from.serializable.element: protectedInstanceMethod(java.lang.String) +WarnSerializableElementTest.java:158:21: compiler.warn.access.to.member.from.serializable.element: privateInstanceMethod(java.lang.String) +WarnSerializableElementTest.java:160:29: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicStaticField +WarnSerializableElementTest.java:161:29: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicClassMethod() +WarnSerializableElementTest.java:164:18: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicInstanceField +WarnSerializableElementTest.java:165:18: compiler.warn.access.to.member.from.serializable.element: effectivelyNonPublicInstanceMethod() +- compiler.err.warnings.and.werror +1 error +32 warnings diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.out b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.out deleted file mode 100644 index 4b1e75430fd..00000000000 --- a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTest.out +++ /dev/null @@ -1,57 +0,0 @@ -WarnSerializableLambdaTest.java:15:38: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:16:38: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:17:38: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:20:38: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:21:38: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:22:38: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:26:39: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPackageField -WarnSerializableLambdaTest.java:27:39: compiler.warn.access.to.sensitive.member.from.serializable.element: staticProtectedField -WarnSerializableLambdaTest.java:28:39: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPrivateField -WarnSerializableLambdaTest.java:30:13: compiler.warn.access.to.sensitive.member.from.serializable.element: packageField -WarnSerializableLambdaTest.java:31:13: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedField -WarnSerializableLambdaTest.java:32:13: compiler.warn.access.to.sensitive.member.from.serializable.element: privateField -WarnSerializableLambdaTest.java:34:39: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:35:39: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:36:39: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:38:13: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:39:13: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:40:13: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:42:25: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicStaticField -WarnSerializableLambdaTest.java:43:25: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicClassMethod() -WarnSerializableLambdaTest.java:46:14: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceField -WarnSerializableLambdaTest.java:47:14: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceMethod() -WarnSerializableLambdaTest.java:56:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPackageField -WarnSerializableLambdaTest.java:57:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticProtectedField -WarnSerializableLambdaTest.java:58:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPrivateField -WarnSerializableLambdaTest.java:60:17: compiler.warn.access.to.sensitive.member.from.serializable.element: packageField -WarnSerializableLambdaTest.java:61:17: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedField -WarnSerializableLambdaTest.java:62:17: compiler.warn.access.to.sensitive.member.from.serializable.element: privateField -WarnSerializableLambdaTest.java:64:43: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:65:43: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:66:43: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:68:17: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:69:17: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:70:17: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:72:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicStaticField -WarnSerializableLambdaTest.java:73:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicClassMethod() -WarnSerializableLambdaTest.java:76:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceField -WarnSerializableLambdaTest.java:77:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceMethod() -WarnSerializableLambdaTest.java:141:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPackageField -WarnSerializableLambdaTest.java:142:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticProtectedField -WarnSerializableLambdaTest.java:143:43: compiler.warn.access.to.sensitive.member.from.serializable.element: staticPrivateField -WarnSerializableLambdaTest.java:148:21: compiler.warn.access.to.sensitive.member.from.serializable.element: packageField -WarnSerializableLambdaTest.java:149:21: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedField -WarnSerializableLambdaTest.java:150:21: compiler.warn.access.to.sensitive.member.from.serializable.element: privateField -WarnSerializableLambdaTest.java:152:43: compiler.warn.access.to.sensitive.member.from.serializable.element: packageClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:153:43: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:154:43: compiler.warn.access.to.sensitive.member.from.serializable.element: privateClassMethod(java.lang.String) -WarnSerializableLambdaTest.java:156:21: compiler.warn.access.to.sensitive.member.from.serializable.element: packageInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:157:21: compiler.warn.access.to.sensitive.member.from.serializable.element: protectedInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:158:21: compiler.warn.access.to.sensitive.member.from.serializable.element: privateInstanceMethod(java.lang.String) -WarnSerializableLambdaTest.java:160:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicStaticField -WarnSerializableLambdaTest.java:161:29: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicClassMethod() -WarnSerializableLambdaTest.java:164:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceField -WarnSerializableLambdaTest.java:165:18: compiler.warn.access.to.sensitive.member.from.serializable.element: effectivelyNonPublicInstanceMethod() -- compiler.err.warnings.and.werror -1 error -54 warnings diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.java b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.java index 6a8a4ab664a..a18fe07a2bf 100644 --- a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.java +++ b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.java @@ -4,7 +4,7 @@ * @summary Enhance compiler warnings for Lambda * Checks that the warning for accessing non public members of a class is * fired correctly. - * @compile/fail/ref=WarnSerializableLambdaTestb.out -XDrawDiagnostics -Werror -XDwarnOnAccessToSensitiveMembers WarnSerializableLambdaTestb.java + * @compile/fail/ref=WarnSerializableLambdaTestb.out -XDrawDiagnostics -Werror -XDwarnOnAccessToMembers WarnSerializableLambdaTestb.java */ import java.io.Serializable; diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.out b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.out index 1aaf1e11072..e672baf6db6 100644 --- a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.out +++ b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestb.out @@ -1,7 +1,5 @@ -WarnSerializableLambdaTestb.java:14:69: compiler.warn.access.to.sensitive.member.from.serializable.element: test() -WarnSerializableLambdaTestb.java:18:69: compiler.warn.access.to.sensitive.member.from.serializable.element: test() -WarnSerializableLambdaTestb.java:36:40: compiler.warn.access.to.sensitive.member.from.serializable.element: j -WarnSerializableLambdaTestb.java:50:25: compiler.warn.access.to.sensitive.member.from.serializable.element: r +WarnSerializableLambdaTestb.java:36:40: compiler.warn.access.to.member.from.serializable.element: j +WarnSerializableLambdaTestb.java:50:25: compiler.warn.access.to.member.from.serializable.element: r - compiler.err.warnings.and.werror 1 error -4 warnings +2 warnings diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.java b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.java new file mode 100644 index 00000000000..7e1985cacbf --- /dev/null +++ b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.java @@ -0,0 +1,20 @@ +/* + * @test /nodynamiccopyright/ + * @bug 8026721 + * @summary Enhance Lambda serialization + * Checks that the warning for accessing non public members of a class is fired correctly. + * @compile -Xlint:serial -Werror WarnSerializableLambdaTestc.java + */ + +import javax.tools.SimpleJavaFileObject; +import java.io.Serializable; + +public class WarnSerializableLambdaTestc { + public interface SerializableIntf extends Serializable { + String get(T o); + } + + private void dontWarn() { + SerializableIntf s = SimpleJavaFileObject::getName; + } +} diff --git a/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.out b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.out new file mode 100644 index 00000000000..d618d566c5e --- /dev/null +++ b/langtools/test/tools/javac/T8029102/WarnSerializableLambdaTestc.out @@ -0,0 +1,4 @@ +WarnSerializableLambdaTestc.java:18:52: compiler.warn.access.to.member.from.serializable.lambda +- compiler.err.warnings.and.werror +1 error +1 warning diff --git a/langtools/test/tools/javac/diags/CheckResourceKeys.java b/langtools/test/tools/javac/diags/CheckResourceKeys.java index dde2681054b..2c96e3f2fdd 100644 --- a/langtools/test/tools/javac/diags/CheckResourceKeys.java +++ b/langtools/test/tools/javac/diags/CheckResourceKeys.java @@ -257,6 +257,8 @@ public class CheckResourceKeys { // ignore package and class names if (cs.matches("(com|java|javax|jdk|sun)\\.[A-Za-z.]+")) continue; + if (cs.matches("(java|javax|sun)\\.")) + continue; // ignore debug flag names if (cs.startsWith("debug.")) continue; diff --git a/langtools/test/tools/javac/diags/examples.not-yet.txt b/langtools/test/tools/javac/diags/examples.not-yet.txt index fbce60ff50c..a2018762ca8 100644 --- a/langtools/test/tools/javac/diags/examples.not-yet.txt +++ b/langtools/test/tools/javac/diags/examples.not-yet.txt @@ -111,6 +111,7 @@ compiler.warn.file.from.future # warning for future mod compiler.err.cant.inherit.from.anon # error for subclass of anonymous class compiler.misc.bad.class.file # class file is malformed compiler.misc.bad.const.pool.entry # constant pool entry has wrong type +compiler.warn.access.to.member.from.serializable.lambda # in order to generate it we need to modify a restricted package # The following module-related messages will have to stay on the not-yet list for various reasons: compiler.warn.locn.unknown.file.on.module.path # Never issued ATM (short circuited with an if (false)) diff --git a/langtools/test/tools/javac/diags/examples/WarnSerializableLambda.java b/langtools/test/tools/javac/diags/examples/WarnSerializableLambda.java index a1a63d5cd68..1fc49a1c175 100644 --- a/langtools/test/tools/javac/diags/examples/WarnSerializableLambda.java +++ b/langtools/test/tools/javac/diags/examples/WarnSerializableLambda.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,21 +21,24 @@ * questions. */ -// key: compiler.warn.access.to.sensitive.member.from.serializable.element -// options: -XDwarnOnAccessToSensitiveMembers +// key: compiler.warn.access.to.member.from.serializable.element +// options: -XDwarnOnAccessToMembers import java.io.Serializable; public class WarnSerializableLambda { - interface SAM { - void apply(String s); - } - private void m1() { - SAM s = (SAM & Serializable) c -> { - packageField = ""; + new SerializableClass() { + @Override + public void m() { + packageField = ""; + } }; } String packageField; + + class SerializableClass implements Serializable { + public void m() {} + } } From af3d6a84090f47edf65a1af4c1794ffdb67b1411 Mon Sep 17 00:00:00 2001 From: Bhavesh Patel Date: Thu, 14 Jul 2016 13:35:35 -0700 Subject: [PATCH 3/8] 8151921: Improved page resolution Reviewed-by: jjg, ksrini, ahgross --- .../doclets/formats/html/markup/HtmlWriter.java | 11 ++++++----- .../doclets/formats/html/markup/HtmlWriter.java | 11 ++++++----- .../sun/javadoc/testJavascript/TestJavascript.java | 13 +++++++------ .../doclet/testJavascript/TestJavascript.java | 13 +++++++------ 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java index 27bb1182fee..eebc537ffcd 100644 --- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java @@ -353,11 +353,12 @@ public class HtmlWriter { protected Content getFramesJavaScript() { HtmlTree script = HtmlTree.SCRIPT(); String scriptCode = DocletConstants.NL + - " targetPage = \"\" + window.location.search;" + DocletConstants.NL + - " if (targetPage != \"\" && targetPage != \"undefined\")" + DocletConstants.NL + - " targetPage = targetPage.substring(1);" + DocletConstants.NL + - " if (targetPage.indexOf(\":\") != -1 || (targetPage != \"\" && !validURL(targetPage)))" + DocletConstants.NL + - " targetPage = \"undefined\";" + DocletConstants.NL + + " tmpTargetPage = \"\" + window.location.search;" + DocletConstants.NL + + " if (tmpTargetPage != \"\" && tmpTargetPage != \"undefined\")" + DocletConstants.NL + + " tmpTargetPage = tmpTargetPage.substring(1);" + DocletConstants.NL + + " if (tmpTargetPage.indexOf(\":\") != -1 || (tmpTargetPage != \"\" && !validURL(tmpTargetPage)))" + DocletConstants.NL + + " tmpTargetPage = \"undefined\";" + DocletConstants.NL + + " targetPage = tmpTargetPage;" + DocletConstants.NL + " function validURL(url) {" + DocletConstants.NL + " try {" + DocletConstants.NL + " url = decodeURIComponent(url);" + DocletConstants.NL + diff --git a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlWriter.java b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlWriter.java index 2e90af8eba9..59de3f0bb1c 100644 --- a/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlWriter.java +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/markup/HtmlWriter.java @@ -234,11 +234,12 @@ public class HtmlWriter { protected Content getFramesJavaScript() { HtmlTree scriptTree = HtmlTree.SCRIPT(); String scriptCode = "\n" + - " targetPage = \"\" + window.location.search;\n" + - " if (targetPage != \"\" && targetPage != \"undefined\")\n" + - " targetPage = targetPage.substring(1);\n" + - " if (targetPage.indexOf(\":\") != -1 || (targetPage != \"\" && !validURL(targetPage)))\n" + - " targetPage = \"undefined\";\n" + + " tmpTargetPage = \"\" + window.location.search;\n" + + " if (tmpTargetPage != \"\" && tmpTargetPage != \"undefined\")\n" + + " tmpTargetPage = tmpTargetPage.substring(1);\n" + + " if (tmpTargetPage.indexOf(\":\") != -1 || (tmpTargetPage != \"\" && !validURL(tmpTargetPage)))\n" + + " tmpTargetPage = \"undefined\";\n" + + " targetPage = tmpTargetPage;\n" + " function validURL(url) {\n" + " try {\n" + " url = decodeURIComponent(url);\n" + diff --git a/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java index 652ef6690fe..7ce84428383 100644 --- a/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java +++ b/langtools/test/com/sun/javadoc/testJavascript/TestJavascript.java @@ -23,7 +23,7 @@ /* * @test - * @bug 4665566 4855876 7025314 8012375 8015997 8016328 8024756 + * @bug 4665566 4855876 7025314 8012375 8015997 8016328 8024756 8151921 * @summary Verify that the output has the right javascript. * @author jamieh * @library ../lib @@ -54,11 +54,12 @@ public class TestJavascript extends JavadocTester { checkOutput("index.html", true, "