1
Joint work with: Stephanie Dietzel, Michael D. Ernst, Kıvanç Muşlu, and Todd W. Schiller
Building and Using Pluggable Type-Checkers Werner M. Dietl Joint - - PowerPoint PPT Presentation
Building and Using Pluggable Type-Checkers Werner M. Dietl Joint work with: Stephanie Dietzel, Michael D. Ernst, Kvan Mulu, and Todd W. Schiller 1 Software still has errors 2 Static type systems 0 errors, Crashes 0 warnings Source
1
Joint work with: Stephanie Dietzel, Michael D. Ernst, Kıvanç Muşlu, and Todd W. Schiller
2
3
Source Code Compiler, Type Checker Executable
Crashes
0 errors, 0 warnings
4
5
6
7
@Encrypted String msg1 = ...;
8
9
10
11
12
13
14
15
java.lang.NullPointerException
16
package.Outer$Inner
Lpackage/Outer$Inner;
Unqualified BinaryName FullyQualifiedName FieldDescriptor
17
18
static Class<?> forName(String className) “Returns the Class object associated with the class or interface with the given string name. ... Parameters: className - the fully qualified name of the desired class”
java.lang.ClassNotFoundException OK!
19
20
– Fields, parameters, … are @NonNull – Only local variables are @Nullable
regular expressions
21
22
@Encrypted String msg1 = ...;
Unqualified Encrypted
23
package.Outer$Inner
Lpackage/Outer$Inner;
Unqualified BinaryName FullyQualifiedName FieldDescriptor
24
@TypeQualifier @SubtypeOf({Unqualified.class}) @ImplicitFor(stringPatterns="^[A-Za-z_] [A-Za-z_0-9]*(\\.[A-Za-z_][A-Za-z_0-9] *)*(\\[\\])*$") public @interface FullyQualifiedName {} @TypeQualifier @SubtypeOf({Unqualified.class}) @ImplicitFor(stringPatterns="^[A-Za-z_] [A-Za-z_0-9]*(\\.[A-Za-z_][A-Za-z_0-9] *)*(\\$[A-Za-z_][A-Za-z_0-9]*)?(\\[\\] )*$") public @interface BinaryName {} @TypeQualifier @SubtypeOf({Unqualified.class}) @ImplicitFor(stringPatterns="^\\[*([BCDF IJSZ]|L[A-Za-z_][A-Za-z_0-9]*(/[A-Za-z_] [A-Za-z_0-9]*)*(\\$[A-Za-z_][A-Za-z_0-9] *)?;)$") public @interface FieldDescriptor {} @TypeQualifier @SubtypeOf({BinaryName.class, FullyQualifiedName.class}) public @interface SourceName {} @TypeQualifier @SubtypeOf({Unqualified.class}) public @interface MethodDescriptor {} @TypeQualifier @SubtypeOf({BinaryName.class, FieldDescriptor.class, SourceName.class, FullyQualifiedName.class, MethodDescriptor.class}) @ImplicitFor(trees={Tree.Kind.NULL_LITERAL}) public @interface SignatureBottom {} @TypeQualifiers({BinaryName.class, FullyQualifiedName.class, SourceName.class, FieldDescriptor.class, Unqualified.class, MethodDescriptor.class, SignatureBottom.class}) public final class SignatureChecker extends BaseTypeChecker {}
Type Qualifiers Type Checker
25
class Class<T> { Class<?> forName(@BinaryName String className); @BinaryName String getName(); @FullyQualifiedName String getCanonicalName(); } String name = myclass.getCanonicalName(); Class.forName(name); // Warning
26
27
28
29