├── .gitignore ├── INSTALL.md ├── LICENSE ├── LICENSE.md ├── README.md ├── bin ├── javamop ├── javamop.bat ├── javamopagent └── javamopagent.bat ├── config ├── omit.txt ├── remote_server_addr.properties └── spec_levels.properties ├── docs ├── JavaMOPAgentUsage.md └── Usage.md ├── examples ├── .gitignore ├── .svnignore ├── BaseAspect │ ├── BaseAspect.aj │ ├── HasNext.mop │ ├── default-baseaspect │ │ ├── HasNextMonitorAspect.aj.expected.out │ │ └── HasNext_1 │ │ │ ├── HasNext_1.expected.err │ │ │ ├── HasNext_1.expected.out │ │ │ └── HasNext_1.java │ └── user-specified-baseaspect │ │ ├── HasNextMonitorAspect.aj.expected.out │ │ ├── HasNext_1 │ │ ├── HasNext_1.expected.err │ │ ├── HasNext_1.expected.out │ │ └── HasNext_1.java │ │ └── Has_Next │ │ ├── Has_Next.expected.err │ │ ├── Has_Next.expected.out │ │ └── Has_Next.java ├── CFG │ ├── HasNext │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.expected.err │ │ │ ├── HasNext_1.expected.out │ │ │ └── HasNext_1.java │ │ └── HasNext_2 │ │ │ ├── HasNext_2.expected.err │ │ │ ├── HasNext_2.expected.out │ │ │ └── HasNext_2.java │ ├── SafeFile │ │ ├── SafeFile.mop │ │ ├── SafeFile_1 │ │ │ ├── SafeFile_1.expected.err │ │ │ ├── SafeFile_1.expected.out │ │ │ └── SafeFile_1.java │ │ └── SafeFile_2 │ │ │ ├── SafeFile_2.expected.err │ │ │ ├── SafeFile_2.expected.out │ │ │ └── SafeFile_2.java │ └── SafeFileWriter │ │ ├── SafeFileWriter.mop │ │ ├── SafeFileWriter_1 │ │ ├── SafeFileWriter_1.expected.err │ │ ├── SafeFileWriter_1.expected.out │ │ └── SafeFileWriter_1.java │ │ └── SafeFileWriter_2 │ │ ├── SafeFileWriter_2.expected.err │ │ ├── SafeFileWriter_2.expected.out │ │ └── SafeFileWriter_2.java ├── ERE │ ├── HasNext │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.expected.err │ │ │ ├── HasNext_1.expected.out │ │ │ └── HasNext_1.java │ │ ├── HasNext_2 │ │ │ ├── HasNext_2.expected.err │ │ │ ├── HasNext_2.expected.out │ │ │ └── HasNext_2.java │ │ └── HasNext_3 │ │ │ ├── HasNext_3.expected.err │ │ │ ├── HasNext_3.expected.out │ │ │ └── HasNext_3.java │ ├── HasNext2 │ │ ├── HasNext2.mop │ │ ├── HasNext2_1 │ │ │ ├── HasNext2_1.java │ │ │ └── HasNext2_1.output │ │ ├── HasNext2_2 │ │ │ ├── HasNext2_2.java │ │ │ └── HasNext2_2.output │ │ └── HasNext2_3 │ │ │ ├── HasNext2_3.java │ │ │ └── HasNext2_3.output │ ├── HashSet │ │ ├── HashSet.mop │ │ ├── HashSet_1 │ │ │ ├── HashSet_1.java │ │ │ └── HashSet_1.output │ │ └── HashSet_2 │ │ │ ├── HashSet_2.java │ │ │ └── HashSet_2.output │ ├── PasswordLogin │ │ ├── MessageDigestClass │ │ │ ├── MessageDigestClass.java │ │ │ └── MessageDigestClass.output │ │ └── PasswordLogin.mop │ ├── SafeEnum │ │ ├── SafeEnum.mop │ │ ├── SafeEnum_1 │ │ │ ├── SafeEnum_1.expected.err │ │ │ ├── SafeEnum_1.expected.out │ │ │ └── SafeEnum_1.java │ │ └── SafeEnum_2 │ │ │ ├── SafeEnum_2.expected.err │ │ │ ├── SafeEnum_2.expected.out │ │ │ └── SafeEnum_2.java │ ├── SafeFileWriter │ │ ├── SafeFileWriter.mop │ │ ├── SafeFileWriter_1 │ │ │ ├── SafeFileWriter_1.expected.err │ │ │ ├── SafeFileWriter_1.expected.out │ │ │ └── SafeFileWriter_1.java │ │ └── SafeFileWriter_2 │ │ │ ├── SafeFileWriter_2.expected.err │ │ │ ├── SafeFileWriter_2.expected.out │ │ │ └── SafeFileWriter_2.java │ ├── SafeSyncCollection │ │ ├── SafeSyncCollection.mop │ │ ├── SafeSyncCollection_1 │ │ │ ├── SafeSyncCollection_1.expected.err │ │ │ ├── SafeSyncCollection_1.expected.out │ │ │ └── SafeSyncCollection_1.java │ │ └── SafeSyncCollection_2 │ │ │ ├── SafeSyncCollection_2.expected.err │ │ │ ├── SafeSyncCollection_2.expected.out │ │ │ └── SafeSyncCollection_2.java │ ├── SafeSyncMap │ │ ├── SafeSyncMap.mop │ │ ├── SafeSyncMap_1 │ │ │ ├── SafeSyncMap_1.expected.err │ │ │ ├── SafeSyncMap_1.expected.out │ │ │ └── SafeSyncMap_1.java │ │ └── SafeSyncMap_2 │ │ │ ├── SafeSyncMap_2.expected.err │ │ │ ├── SafeSyncMap_2.expected.out │ │ │ └── SafeSyncMap_2.java │ ├── SuffixHasNext │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.java │ │ │ └── HasNext_1.output │ │ ├── HasNext_2 │ │ │ ├── HasNext_2.java │ │ │ └── HasNext_2.output │ │ └── HasNext_3 │ │ │ ├── HasNext_3.java │ │ │ └── HasNext_3.output │ ├── UnsafeIterator │ │ ├── UnsafeIterator.mop │ │ ├── UnsafeIterator_1 │ │ │ ├── UnsafeIterator_1.expected.err │ │ │ ├── UnsafeIterator_1.expected.out │ │ │ └── UnsafeIterator_1.java │ │ └── UnsafeIterator_2 │ │ │ ├── UnsafeIterator_2.expected.err │ │ │ ├── UnsafeIterator_2.expected.out │ │ │ └── UnsafeIterator_2.java │ └── UnsafeMapIterator │ │ ├── UnsafeMapIterator.mop │ │ ├── UnsafeMapIterator_1 │ │ ├── UnsafeMapIterator_1.expected.err │ │ ├── UnsafeMapIterator_1.expected.out │ │ └── UnsafeMapIterator_1.java │ │ └── UnsafeMapIterator_2 │ │ ├── UnsafeMapIterator_2.expected.err │ │ ├── UnsafeMapIterator_2.expected.out │ │ └── UnsafeMapIterator_2.java ├── EndProgram │ ├── FileClose │ │ ├── FileClose.mop │ │ ├── FileClose_1 │ │ │ ├── FileClose_1.expected.err │ │ │ ├── FileClose_1.expected.out │ │ │ └── FileClose_1.java │ │ └── FileClose_2 │ │ │ ├── FileClose_2.expected.err │ │ │ ├── FileClose_2.expected.out │ │ │ └── FileClose_2.java │ └── HasNext │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ ├── HasNext_1.java │ │ └── HasNext_1.output │ │ ├── HasNext_2 │ │ ├── HasNext_2.java │ │ └── HasNext_2.output │ │ └── HasNext_3 │ │ ├── HasNext_3.java │ │ └── HasNext_3.output ├── ErrorMessages │ ├── SameEventNames │ │ ├── UnsafeIterator.err │ │ └── UnsafeIterator.mop │ ├── UnknownLogic │ │ ├── UnsafeIterator.err │ │ └── UnsafeIterator.mop │ └── WrongHandler │ │ ├── UnsafeIterator.err │ │ └── UnsafeIterator.mop ├── FSM │ ├── HasNext │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.expected.err │ │ │ ├── HasNext_1.expected.out │ │ │ └── HasNext_1.java │ │ └── HasNext_2 │ │ │ ├── HasNext_2.expected.err │ │ │ ├── HasNext_2.expected.out │ │ │ └── HasNext_2.java │ └── HasNext2 │ │ ├── HasNext2.mop │ │ ├── HasNext2_1 │ │ ├── HasNext2_1.expected.err │ │ ├── HasNext2_1.expected.out │ │ └── HasNext2_1.java │ │ ├── HasNext2_2 │ │ ├── HasNext2_2.expected.err │ │ ├── HasNext2_2.expected.out │ │ └── HasNext2_2.java │ │ └── HasNext2_3 │ │ ├── HasNext2_3.expected.err │ │ ├── HasNext2_3.expected.out │ │ └── HasNext2_3.java ├── LTL │ ├── HasNext │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.expected.err │ │ │ ├── HasNext_1.expected.out │ │ │ └── HasNext_1.java │ │ ├── HasNext_2 │ │ │ ├── HasNext_2.expected.err │ │ │ ├── HasNext_2.expected.out │ │ │ └── HasNext_2.java │ │ └── HasNext_3 │ │ │ ├── HasNext_3.expected.err │ │ │ ├── HasNext_3.expected.out │ │ │ └── HasNext_3.java │ ├── SafeEnum │ │ ├── SafeEnum.mop │ │ ├── SafeEnum_1 │ │ │ ├── SafeEnum_1.expected.err │ │ │ ├── SafeEnum_1.expected.out │ │ │ └── SafeEnum_1.java │ │ └── SafeEnum_2 │ │ │ ├── SafeEnum_2.expected.err │ │ │ ├── SafeEnum_2.expected.out │ │ │ └── SafeEnum_2.java │ ├── SafeFileWriter │ │ ├── SafeFileWriter.mop │ │ ├── SafeFileWriter_1 │ │ │ ├── SafeFileWriter_1.expected.err │ │ │ ├── SafeFileWriter_1.expected.out │ │ │ └── SafeFileWriter_1.java │ │ └── SafeFileWriter_2 │ │ │ ├── SafeFileWriter_2.expected.err │ │ │ ├── SafeFileWriter_2.expected.out │ │ │ └── SafeFileWriter_2.java │ ├── SafeIterator │ │ ├── SafeIterator.mop │ │ ├── SafeIterator_1 │ │ │ ├── SafeIterator_1.expected.err │ │ │ ├── SafeIterator_1.expected.out │ │ │ └── SafeIterator_1.java │ │ └── SafeIterator_2 │ │ │ ├── SafeIterator_2.expected.err │ │ │ ├── SafeIterator_2.expected.out │ │ │ └── SafeIterator_2.java │ └── SafeMapIterator │ │ ├── SafeMapIterator.mop │ │ ├── SafeMapIterator_1 │ │ ├── SafeMapIterator_1.expected.err │ │ ├── SafeMapIterator_1.expected.out │ │ └── SafeMapIterator_1.java │ │ └── SafeMapIterator_2 │ │ ├── SafeMapIterator_2.expected.err │ │ ├── SafeMapIterator_2.expected.out │ │ └── SafeMapIterator_2.java ├── MOPSyntax │ ├── AroundAdvice │ │ ├── CheatedSlotMachine.mop │ │ └── CheatedSlotMachine_1 │ │ │ ├── CheatedSlotMachine_1.java │ │ │ └── SlotMachine.java │ ├── Creation │ │ ├── Creation.mop │ │ ├── Creation_1 │ │ │ ├── Creation_1.expected.err │ │ │ ├── Creation_1.expected.out │ │ │ └── Creation_1.java │ │ ├── Creation_2 │ │ │ ├── Creation_2.expected.err │ │ │ ├── Creation_2.expected.out │ │ │ └── Creation_2.java │ │ └── Creation_3 │ │ │ ├── Creation_3.expected.err │ │ │ ├── Creation_3.expected.out │ │ │ └── Creation_3.java │ ├── Creation2 │ │ ├── Creation.mop │ │ ├── Creation_1 │ │ │ ├── Creation_1.java │ │ │ └── Creation_1.output │ │ ├── Creation_2 │ │ │ ├── Creation_2.java │ │ │ └── Creation_2.output │ │ └── Creation_3 │ │ │ ├── Creation_3.java │ │ │ └── Creation_3.output │ ├── EnforceTest │ │ ├── EnforceTest.mop │ │ └── EnforceTest_1 │ │ │ ├── EnforceTest_1.expected.err │ │ │ ├── EnforceTest_1.expected.out │ │ │ └── EnforceTest_1.java │ ├── ExtendedEventParameters │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.java │ │ │ └── HasNext_1.output │ │ ├── HasNext_2 │ │ │ ├── HasNext_2.java │ │ │ └── HasNext_2.output │ │ └── HasNext_3 │ │ │ ├── HasNext_3.java │ │ │ └── HasNext_3.output │ ├── MOP_Name │ │ └── some-bad-name.mop │ ├── PerThread │ │ ├── HasNext.mop │ │ ├── HasNext_1 │ │ │ ├── HasNext_1.java │ │ │ └── HasNext_1.output │ │ ├── HasNext_2 │ │ │ ├── HasNext_2.java │ │ │ └── HasNext_2.output │ │ └── HasNext_3 │ │ │ ├── HasNext_3.java │ │ │ └── HasNext_3.output │ ├── Pointcut │ │ ├── Comparable_CompareToNull.mop │ │ └── Comparable_CompareToNullException.mop │ ├── Raw │ │ ├── HasNext.mop │ │ └── ThreeInOne.mop │ └── StaticEvent │ │ └── HasNext.mop ├── agent │ ├── .gitignore │ ├── HasNext │ │ ├── HasNext_1.java │ │ ├── HasNext_2.java │ │ ├── HasNext_3.java │ │ └── rvm │ │ │ └── HasNext.mop │ ├── README │ ├── SafeEnum │ │ ├── SafeEnum_1.java │ │ ├── SafeEnum_2.java │ │ └── rvm │ │ │ └── SafeEnum.mop │ ├── SafeFile │ │ ├── SafeFile_1.java │ │ ├── SafeFile_2.java │ │ └── rvm │ │ │ └── SafeFile.mop │ ├── SafeMapIterator │ │ ├── SafeMapIterator_1.java │ │ ├── SafeMapIterator_2.java │ │ └── rvm │ │ │ └── SafeMapIterator.mop │ ├── all-java-api-properties.jar │ └── many │ │ ├── HasNext_1.java │ │ ├── HasNext_2.java │ │ ├── HasNext_3.java │ │ ├── SafeEnum_1.java │ │ ├── SafeEnum_2.java │ │ ├── SafeFile_1.java │ │ ├── SafeFile_2.java │ │ ├── SafeMapIterator_1.java │ │ ├── SafeMapIterator_2.java │ │ └── rvm │ │ ├── cfg │ │ ├── SafeFile.mop │ │ └── SafeFileWriter.mop │ │ ├── ere │ │ ├── FileClose.mop │ │ ├── HasNext.mop │ │ ├── HashSet.mop │ │ ├── PasswordLogin.mop │ │ ├── SafeEnum.mop │ │ ├── SafeMapIterator.mop │ │ ├── SafeSyncCollection.mop │ │ ├── SafeSyncMap.mop │ │ ├── UnsafeIterator.mop │ │ └── UnsafeMapIterator.mop │ │ ├── ltl │ │ └── SafeIterator.mop │ │ └── output │ │ └── readme.txt └── javamopagent │ └── HasNext.mop ├── pom.xml ├── src ├── README.md ├── main │ ├── assembly │ │ └── assembly.xml │ ├── java │ │ └── javamop │ │ │ ├── JavaMOPAgentMain.java │ │ │ ├── JavaMOPAgentOptions.java │ │ │ ├── JavaMOPMain.java │ │ │ ├── JavaMOPOptions.java │ │ │ ├── README.md │ │ │ ├── agent │ │ │ └── SeparateAgentGenerator.java │ │ │ ├── output │ │ │ ├── AspectJCode.java │ │ │ ├── Imports.java │ │ │ ├── MOPErrorChecker.java │ │ │ ├── MOPProcessor.java │ │ │ ├── MOPVariable.java │ │ │ ├── Package.java │ │ │ ├── SystemAspect.java │ │ │ └── combinedaspect │ │ │ │ ├── ActivatorManager.java │ │ │ │ ├── CombinedAspect.java │ │ │ │ ├── GlobalLock.java │ │ │ │ ├── LockManager.java │ │ │ │ ├── MOPStatManager.java │ │ │ │ ├── MOPStatistics.java │ │ │ │ └── event │ │ │ │ ├── EndObject.java │ │ │ │ ├── EndProgram.java │ │ │ │ ├── EndThread.java │ │ │ │ ├── EventManager.java │ │ │ │ ├── PointcutComparator.java │ │ │ │ ├── StartThread.java │ │ │ │ ├── ThreadStatusMonitor.java │ │ │ │ └── advice │ │ │ │ ├── AdviceAndPointCut.java │ │ │ │ ├── AdviceBody.java │ │ │ │ ├── AroundAdviceLocalDecl.java │ │ │ │ └── AroundAdviceReturn.java │ │ │ ├── parser │ │ │ ├── JavaMOPExtender.java │ │ │ ├── JavaParserAdapter.java │ │ │ ├── Main.java │ │ │ ├── SpecExtractor.java │ │ │ ├── aspectj_parser │ │ │ │ └── Token.java │ │ │ ├── ast │ │ │ │ ├── CompilationUnit.java │ │ │ │ ├── ImportDeclaration.java │ │ │ │ ├── MOPSpecFile.java │ │ │ │ ├── Node.java │ │ │ │ ├── PackageDeclaration.java │ │ │ │ ├── TypeParameter.java │ │ │ │ ├── aspectj │ │ │ │ │ ├── ArgsPointCut.java │ │ │ │ │ ├── AspectJModifierSet.java │ │ │ │ │ ├── BaseTypePattern.java │ │ │ │ │ ├── CFlowPointCut.java │ │ │ │ │ ├── CombinedPointCut.java │ │ │ │ │ ├── CombinedTypePattern.java │ │ │ │ │ ├── ConditionPointCut.java │ │ │ │ │ ├── CountCondPointCut.java │ │ │ │ │ ├── EndObjectPointCut.java │ │ │ │ │ ├── EndProgramPointCut.java │ │ │ │ │ ├── EndThreadPointCut.java │ │ │ │ │ ├── FieldPattern.java │ │ │ │ │ ├── FieldPointCut.java │ │ │ │ │ ├── IDPointCut.java │ │ │ │ │ ├── IFPointCut.java │ │ │ │ │ ├── MethodPattern.java │ │ │ │ │ ├── MethodPointCut.java │ │ │ │ │ ├── NotPointCut.java │ │ │ │ │ ├── NotTypePattern.java │ │ │ │ │ ├── PointCut.java │ │ │ │ │ ├── StartThreadPointCut.java │ │ │ │ │ ├── TargetPointCut.java │ │ │ │ │ ├── ThisPointCut.java │ │ │ │ │ ├── ThreadBlockedPointCut.java │ │ │ │ │ ├── ThreadNamePointCut.java │ │ │ │ │ ├── ThreadPointCut.java │ │ │ │ │ ├── TypePattern.java │ │ │ │ │ ├── WildcardParameter.java │ │ │ │ │ ├── WithinPointCut.java │ │ │ │ │ └── WithincodePointCut.java │ │ │ │ ├── body │ │ │ │ │ ├── AnnotationDeclaration.java │ │ │ │ │ ├── AnnotationMemberDeclaration.java │ │ │ │ │ ├── BodyDeclaration.java │ │ │ │ │ ├── ClassOrInterfaceDeclaration.java │ │ │ │ │ ├── ConstructorDeclaration.java │ │ │ │ │ ├── EmptyMemberDeclaration.java │ │ │ │ │ ├── EmptyTypeDeclaration.java │ │ │ │ │ ├── EnumConstantDeclaration.java │ │ │ │ │ ├── EnumDeclaration.java │ │ │ │ │ ├── FieldDeclaration.java │ │ │ │ │ ├── InitializerDeclaration.java │ │ │ │ │ ├── MethodDeclaration.java │ │ │ │ │ ├── ModifierSet.java │ │ │ │ │ ├── Parameter.java │ │ │ │ │ ├── TypeDeclaration.java │ │ │ │ │ ├── VariableDeclarator.java │ │ │ │ │ └── VariableDeclaratorId.java │ │ │ │ ├── expr │ │ │ │ │ ├── AnnotationExpr.java │ │ │ │ │ ├── ArrayAccessExpr.java │ │ │ │ │ ├── ArrayCreationExpr.java │ │ │ │ │ ├── ArrayInitializerExpr.java │ │ │ │ │ ├── AssignExpr.java │ │ │ │ │ ├── BinaryExpr.java │ │ │ │ │ ├── BooleanLiteralExpr.java │ │ │ │ │ ├── CastExpr.java │ │ │ │ │ ├── CharLiteralExpr.java │ │ │ │ │ ├── ClassExpr.java │ │ │ │ │ ├── ConditionalExpr.java │ │ │ │ │ ├── DoubleLiteralExpr.java │ │ │ │ │ ├── EnclosedExpr.java │ │ │ │ │ ├── Expression.java │ │ │ │ │ ├── FieldAccessExpr.java │ │ │ │ │ ├── InstanceOfExpr.java │ │ │ │ │ ├── IntegerLiteralExpr.java │ │ │ │ │ ├── IntegerLiteralMinValueExpr.java │ │ │ │ │ ├── LiteralExpr.java │ │ │ │ │ ├── LongLiteralExpr.java │ │ │ │ │ ├── LongLiteralMinValueExpr.java │ │ │ │ │ ├── MarkerAnnotationExpr.java │ │ │ │ │ ├── MemberValuePair.java │ │ │ │ │ ├── MethodCallExpr.java │ │ │ │ │ ├── NameExpr.java │ │ │ │ │ ├── NormalAnnotationExpr.java │ │ │ │ │ ├── NullLiteralExpr.java │ │ │ │ │ ├── ObjectCreationExpr.java │ │ │ │ │ ├── QualifiedNameExpr.java │ │ │ │ │ ├── SingleMemberAnnotationExpr.java │ │ │ │ │ ├── StringLiteralExpr.java │ │ │ │ │ ├── SuperExpr.java │ │ │ │ │ ├── SuperMemberAccessExpr.java │ │ │ │ │ ├── ThisExpr.java │ │ │ │ │ ├── UnaryExpr.java │ │ │ │ │ └── VariableDeclarationExpr.java │ │ │ │ ├── mopspec │ │ │ │ │ ├── EventDefinition.java │ │ │ │ │ ├── Formula.java │ │ │ │ │ ├── JavaMOPSpec.java │ │ │ │ │ ├── MOPParameter.java │ │ │ │ │ ├── MOPParameters.java │ │ │ │ │ ├── Property.java │ │ │ │ │ ├── PropertyAndHandlers.java │ │ │ │ │ └── SpecModifierSet.java │ │ │ │ ├── stmt │ │ │ │ │ ├── AssertStmt.java │ │ │ │ │ ├── BlockStmt.java │ │ │ │ │ ├── BreakStmt.java │ │ │ │ │ ├── CatchClause.java │ │ │ │ │ ├── ContinueStmt.java │ │ │ │ │ ├── DoStmt.java │ │ │ │ │ ├── EmptyStmt.java │ │ │ │ │ ├── ExplicitConstructorInvocationStmt.java │ │ │ │ │ ├── ExpressionStmt.java │ │ │ │ │ ├── ForStmt.java │ │ │ │ │ ├── ForeachStmt.java │ │ │ │ │ ├── IfStmt.java │ │ │ │ │ ├── LabeledStmt.java │ │ │ │ │ ├── ReturnStmt.java │ │ │ │ │ ├── Statement.java │ │ │ │ │ ├── SwitchEntryStmt.java │ │ │ │ │ ├── SwitchStmt.java │ │ │ │ │ ├── SynchronizedStmt.java │ │ │ │ │ ├── ThrowStmt.java │ │ │ │ │ ├── TryStmt.java │ │ │ │ │ ├── TypeDeclarationStmt.java │ │ │ │ │ └── WhileStmt.java │ │ │ │ ├── type │ │ │ │ │ ├── ClassOrInterfaceType.java │ │ │ │ │ ├── PrimitiveType.java │ │ │ │ │ ├── ReferenceType.java │ │ │ │ │ ├── Type.java │ │ │ │ │ ├── VoidType.java │ │ │ │ │ └── WildcardType.java │ │ │ │ └── visitor │ │ │ │ │ ├── CheckThisJoinPointVisitor.java │ │ │ │ │ ├── CollectMOPVarVisitor.java │ │ │ │ │ ├── CollectUserVarVisitor.java │ │ │ │ │ ├── ConditionVisitor.java │ │ │ │ │ ├── ConvertPointcutToCNFVisitor.java │ │ │ │ │ ├── CountCondVisitor.java │ │ │ │ │ ├── DumpVisitor.java │ │ │ │ │ ├── EndObjectTypeVisitor.java │ │ │ │ │ ├── EndObjectVisitor.java │ │ │ │ │ ├── EndProgramVisitor.java │ │ │ │ │ ├── EndThreadVisitor.java │ │ │ │ │ ├── GenericVisitor.java │ │ │ │ │ ├── MoveNotInwardPointcutVisitor.java │ │ │ │ │ ├── PointcutVisitor.java │ │ │ │ │ ├── RVDumpVisitor.java │ │ │ │ │ ├── RemoveConditionVisitor.java │ │ │ │ │ ├── RemoveCountCondVisitor.java │ │ │ │ │ ├── RemoveEndObjectVisitor.java │ │ │ │ │ ├── RemoveEndProgramVisitor.java │ │ │ │ │ ├── RemoveEndThreadVisitor.java │ │ │ │ │ ├── RemovePointCutVisitor.java │ │ │ │ │ ├── RemoveThreadBlockedVisitor.java │ │ │ │ │ ├── RemoveThreadNameVisitor.java │ │ │ │ │ ├── RemoveThreadVisitor.java │ │ │ │ │ ├── SourcePrinter.java │ │ │ │ │ ├── StartThreadVisitor.java │ │ │ │ │ ├── ThreadBlockedVarVisitor.java │ │ │ │ │ ├── ThreadNameVarVisitor.java │ │ │ │ │ ├── ThreadVarVisitor.java │ │ │ │ │ └── VoidVisitor.java │ │ │ ├── astex │ │ │ │ ├── ExtNode.java │ │ │ │ ├── MOPSpecFileExt.java │ │ │ │ ├── aspectj │ │ │ │ │ ├── EventPointCut.java │ │ │ │ │ └── HandlerPointCut.java │ │ │ │ ├── mopspec │ │ │ │ │ ├── EventDefinitionExt.java │ │ │ │ │ ├── ExtendedSpec.java │ │ │ │ │ ├── FormulaExt.java │ │ │ │ │ ├── HandlerExt.java │ │ │ │ │ ├── JavaMOPSpecExt.java │ │ │ │ │ ├── PropertyAndHandlersExt.java │ │ │ │ │ ├── PropertyExt.java │ │ │ │ │ └── ReferenceSpec.java │ │ │ │ └── visitor │ │ │ │ │ ├── CollectEventPointCutVisitor.java │ │ │ │ │ ├── CollectHandlerPointCutVisitor.java │ │ │ │ │ ├── DumpVisitor.java │ │ │ │ │ ├── GenericVisitor.java │ │ │ │ │ ├── PointcutVisitor.java │ │ │ │ │ ├── RenameVariableVisitor.java │ │ │ │ │ ├── ReplacePointCutVisitor.java │ │ │ │ │ └── VoidVisitor.java │ │ │ ├── main_parser │ │ │ │ └── Token.java │ │ │ └── rvm │ │ │ │ └── core │ │ │ │ └── ast │ │ │ │ ├── Event.java │ │ │ │ ├── MonitorFile.java │ │ │ │ ├── Property.java │ │ │ │ ├── PropertyHandler.java │ │ │ │ └── Specification.java │ │ │ ├── specfiltering │ │ │ ├── Configuration.java │ │ │ ├── SpecFilter.java │ │ │ └── TextConfiguration.java │ │ │ └── util │ │ │ ├── FileCombiner.java │ │ │ ├── MOPException.java │ │ │ ├── MOPFileVisitor.java │ │ │ ├── MOPNameSpace.java │ │ │ ├── Pair.java │ │ │ └── Tool.java │ ├── javacc │ │ └── javamop │ │ │ └── parser │ │ │ ├── aspectj_parser │ │ │ └── aspectj.jj │ │ │ └── main_parser │ │ │ ├── RVParser.jj │ │ │ └── javamop.jj │ ├── resources │ │ └── javamop │ │ │ ├── parser │ │ │ ├── ast │ │ │ │ └── License.txt │ │ │ └── main_parser │ │ │ │ ├── License.txt │ │ │ │ └── README │ │ │ └── schemas │ │ │ └── logicrepository.xsd │ └── scripts │ │ └── bin │ │ ├── javamop │ │ ├── javamop.bat │ │ ├── javamopagent │ │ └── javamopagent.bat └── test │ ├── java │ ├── system │ │ ├── baseaspect │ │ │ └── BaseAspectIT.java │ │ ├── examples │ │ │ ├── ExamplesIT.java │ │ │ ├── ExamplesWithNameArgumentIT.java │ │ │ ├── ReadDirIT.java │ │ │ └── TestHelper.java │ │ ├── pointcut │ │ │ └── DuplicatePointcutIT.java │ │ └── syntax │ │ │ └── StaticEventIT.java │ └── unit │ │ └── javamop │ │ ├── NodeEquivalenceChecker.java │ │ ├── helper │ │ ├── ExpectedOutputGenerator.java │ │ ├── IOUtils.java │ │ ├── MOP_Serialization.java │ │ └── ShapeCheckingVisitor.java │ │ ├── input │ │ ├── HasNext.mo │ │ ├── JavaMOPMainTest.java │ │ └── SafeIterator.mop │ │ ├── output │ │ ├── MOPProcessorTest.java │ │ └── combinedaspect │ │ │ └── event │ │ │ └── EventMethodHelperTest.java │ │ ├── parser │ │ ├── AdviceParamsWithGenericsTest.java │ │ └── SpecExtractorTest.java │ │ └── util │ │ └── ToolTest.java │ └── resources │ ├── Creation.mop.ser │ ├── FileClose.mop.ser │ ├── HasNext.mop.ser │ ├── ReadMe.txt │ ├── SafeFile.mop.ser │ ├── SafeFileWriter.mop.ser │ ├── UnsafeMapIterator.mop.ser │ ├── multi-property │ ├── UnsafeIterator.mop │ ├── UnsafeIterator.rvm.expected │ └── UnsafeIteratorMonitorAspect.aj.expected │ ├── output │ ├── Creation.mop.aj │ ├── Creation.mop.rvm │ ├── FileClose.mop.aj │ ├── FileClose.mop.rvm │ ├── HasNext.mop.aj │ ├── HasNext.mop.rvm │ ├── SafeFile.mop.aj │ ├── SafeFile.mop.rvm │ ├── SafeFileWriter.mop.aj │ ├── SafeFileWriter.mop.rvm │ ├── UnsafeMapIterator.mop.aj │ └── UnsafeMapIterator.mop.rvm │ └── single-property │ ├── AdviceParamsWithGenericsBasic.mop │ ├── AdviceParamsWithGenericsIllegal.mop │ ├── AdviceParamsWithGenericsMultipleBasic.mop │ ├── AdviceParamsWithGenericsMultipleNested.mop │ ├── AdviceParamsWithGenericsNested.mop │ └── AdviceParamsWithGenericsWildcard.mop └── unit-test-design.txt /.gitignore: -------------------------------------------------------------------------------- 1 | lib/javamop.jar 2 | lib/javamoptestsuite.jar 3 | lib/log/ 4 | test-reports/ 5 | build/ 6 | target/ 7 | release/ 8 | .idea 9 | *.iml 10 | *~ 11 | *.bak 12 | *.rvm 13 | *.actual.err 14 | *.actual.out 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2002-2020 University of Illinois at Urbana-Champaign and Runtime Verification Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /bin/javamop: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # The below incantation sets SRC_ROOT to be the canonicalized directory of this script 3 | SRC_ROOT=$( 4 | cd -P -- "$(dirname -- "$0")" && 5 | printf '%s\n' "$(pwd -P)/$(basename -- "$0")" 6 | ) || exit 1 7 | SRC_ROOT=`dirname "$SRC_ROOT"` 8 | # Move up into the actual source root directory 9 | SRC_ROOT="$SRC_ROOT/../" 10 | # This file exists to make running the tests the same as running the examples produced 11 | # by the installer. 12 | $SRC_ROOT/target/release/javamop/javamop/bin/javamop $@ 13 | -------------------------------------------------------------------------------- /bin/javamop.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set SRC_ROOT=%~dp0.. 3 | %SRC_ROOT%\target\release\javamop\javamop\bin\javamop %1 %2 %3 %4 %5 %6 %7 %8 %9 4 | -------------------------------------------------------------------------------- /bin/javamopagent: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # The below incantation sets SRC_ROOT to be the canonicalized directory of this script 3 | SRC_ROOT=$( 4 | cd -P -- "$(dirname -- "$0")" && 5 | printf '%s\n' "$(pwd -P)/$(basename -- "$0")" 6 | ) || exit 1 7 | SRC_ROOT=`dirname "$SRC_ROOT"` 8 | # Move up into the actual source root directory 9 | SRC_ROOT="$SRC_ROOT/../" 10 | # This file exists to make running the tests the same as running the examples produced 11 | # by the installer. 12 | $SRC_ROOT/target/release/javamop/javamop/bin/javamopagent $@ 13 | -------------------------------------------------------------------------------- /bin/javamopagent.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | set SRC_ROOT=%~dp0.. 3 | %SRC_ROOT%\target\release\javamop\javamop\bin\javamopagent %1 %2 %3 %4 %5 %6 %7 %8 %9 4 | -------------------------------------------------------------------------------- /config/omit.txt: -------------------------------------------------------------------------------- 1 | Comparable_CompareToNullException.mop 2 | -------------------------------------------------------------------------------- /config/remote_server_addr.properties: -------------------------------------------------------------------------------- 1 | # Specify the logic repository server address. 2 | # This address will be used when having -remote option. 3 | ServerAddr = http://fsl.cs.uiuc.edu/jsps/logic-2.2.php 4 | 5 | # The URL from which properties are to be downloaded 6 | PropertyDBURL = https://github.com/runtimeverification/property-db.git 7 | 8 | # The VCS system used in the property DB (git or hg) 9 | PropertyDBVCS = git 10 | 11 | # Whether or not to cleanup after generating agent from property-db 12 | PropertyDBCleanup = false 13 | 14 | # Name of the config file to be used for filtering 15 | FilterConf = spec_levels.properties 16 | 17 | # Name of file for specifying properties to be omitted from agent generation, even after filtering 18 | OmitFile = omit.txt -------------------------------------------------------------------------------- /config/spec_levels.properties: -------------------------------------------------------------------------------- 1 | #For each package (key) listed in that file, the corresponding severity 2 | #level (value) is the highest severity level of spec files to be used. 3 | #To omit an entire package from use, simply comment it out below 4 | io=suggestion 5 | lang=suggestion 6 | util=suggestion 7 | net=suggestion 8 | -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | *.aj 2 | *.class 3 | -------------------------------------------------------------------------------- /examples/.svnignore: -------------------------------------------------------------------------------- 1 | *.class 2 | *.aj -------------------------------------------------------------------------------- /examples/BaseAspect/BaseAspect.aj: -------------------------------------------------------------------------------- 1 | public aspect BaseAspect { 2 | pointcut notwithin() : 3 | !within(*HasNext*); 4 | } 5 | -------------------------------------------------------------------------------- /examples/BaseAspect/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | ere : (hasnext hasnext* next)* 24 | 25 | @fail { 26 | System.err.println( 27 | "! hasNext() has not been called" 28 | + " before calling next() for an" 29 | + " iterator"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/BaseAspect/default-baseaspect/HasNext_1/HasNext_1.expected.err: -------------------------------------------------------------------------------- 1 | ! hasNext() has not been called before calling next() for an iterator 2 | ! hasNext() has not been called before calling next() for an iterator 3 | ! hasNext() has not been called before calling next() for an iterator 4 | -------------------------------------------------------------------------------- /examples/BaseAspect/default-baseaspect/HasNext_1/HasNext_1.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/BaseAspect/default-baseaspect/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext_1 { 5 | public static void main(String[] args){ 6 | Vector v = new Vector(); 7 | 8 | v.add(1); 9 | v.add(2); 10 | v.add(4); 11 | v.add(8); 12 | 13 | Iterator i = v.iterator(); 14 | int sum = 0; 15 | 16 | if(i.hasNext()){ 17 | sum += (Integer)i.next(); 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | } 22 | 23 | System.out.println("sum: " + sum); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/HasNextMonitorAspect.aj.expected.out: -------------------------------------------------------------------------------- 1 | package mop; 2 | import java.io.*; 3 | import java.util.*; 4 | import java.util.concurrent.*; 5 | import java.util.concurrent.locks.*; 6 | 7 | import java.lang.ref.*; 8 | import org.aspectj.lang.*; 9 | 10 | aspect BaseAspect { 11 | pointcut notwithin() : 12 | !within(*HasNext*); 13 | } 14 | 15 | public aspect HasNextMonitorAspect implements com.runtimeverification.rvmonitor.java.rt.RVMObject { 16 | public HasNextMonitorAspect(){ 17 | } 18 | 19 | // Declarations for the Lock 20 | static ReentrantLock HasNext_MOPLock = new ReentrantLock(); 21 | static Condition HasNext_MOPLock_cond = HasNext_MOPLock.newCondition(); 22 | 23 | pointcut MOP_CommonPointCut() : !within(com.runtimeverification.rvmonitor.java.rt.RVMObject+) && !adviceexecution() && BaseAspect.notwithin(); 24 | pointcut HasNext_next(Iterator i) : (call(* Iterator.next()) && target(i)) && MOP_CommonPointCut(); 25 | before (Iterator i) : HasNext_next(i) { 26 | HasNextRuntimeMonitor.nextEvent(i); 27 | } 28 | 29 | pointcut HasNext_hasnext(Iterator i) : (call(* Iterator.hasNext()) && target(i)) && MOP_CommonPointCut(); 30 | after (Iterator i) : HasNext_hasnext(i) { 31 | HasNextRuntimeMonitor.hasnextEvent(i); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/HasNext_1/HasNext_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/BaseAspect/user-specified-baseaspect/HasNext_1/HasNext_1.expected.err -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/HasNext_1/HasNext_1.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/Has_Next/Has_Next.expected.err: -------------------------------------------------------------------------------- 1 | ! hasNext() has not been called before calling next() for an iterator 2 | ! hasNext() has not been called before calling next() for an iterator 3 | ! hasNext() has not been called before calling next() for an iterator 4 | -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/Has_Next/Has_Next.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/BaseAspect/user-specified-baseaspect/Has_Next/Has_Next.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class Has_Next { 5 | public static void main(String[] args){ 6 | Vector v = new Vector(); 7 | 8 | v.add(1); 9 | v.add(2); 10 | v.add(4); 11 | v.add(8); 12 | 13 | Iterator i = v.iterator(); 14 | int sum = 0; 15 | 16 | if(i.hasNext()){ 17 | sum += (Integer)i.next(); 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | } 22 | 23 | System.out.println("sum: " + sum); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies a case in which the 8 | // hasnext method is not called before calling the 9 | // next method, i.e. next is called twice in a row. 10 | // It is monitored for the match condition 11 | // and requires suffix matching to work properly. 12 | // This property is borrowed from tracematches 13 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers) 14 | // 15 | // We use lr rather than lalr because we are monitoring 16 | // for matching rather than failure 17 | 18 | suffix HasNext(Iterator i) { 19 | event hasnext before(Iterator i) : 20 | call(* Iterator.hasNext()) && target(i) {} 21 | event next before(Iterator i) : 22 | call(* Iterator.next()) && target(i) {} 23 | 24 | cfg : S -> next next 25 | 26 | @match { 27 | System.err.println("! hasNext not called before next"); 28 | __RESET; 29 | } 30 | } 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext_1/HasNext_1.expected.err: -------------------------------------------------------------------------------- 1 | ! hasNext not called before next 2 | ! hasNext not called before next 3 | ! hasNext not called before next 4 | -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext_1/HasNext_1.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | sum += (Integer)i.next(); 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | 22 | System.out.println("sum: " + sum); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext_2/HasNext_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/CFG/HasNext/HasNext_2/HasNext_2.expected.err -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext_2/HasNext_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/CFG/HasNext/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/CFG/SafeFile/SafeFile.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // SafeFile is designed to match nested, matched 8 | // open closes within a method. This follows the 9 | // software engineering practice of closing files 10 | // within the method they are opened. It should 11 | // be monitored with an @fail handler, because 12 | // the CFG specifies the correct behavior. 13 | 14 | SafeFile(FileReader f, Thread t) { 15 | event open after(Thread t) returning(FileReader f) : 16 | call(FileReader.new(..)) && thread(t){} 17 | event close after(FileReader f, Thread t) : 18 | call(* FileReader.close(..)) && target(f) && thread(t){} 19 | event begin before(Thread t) : 20 | execution(* *.*(..)) && thread(t) {} 21 | event end after(Thread t) : 22 | execution(* *.*(..)) && thread(t) {} 23 | 24 | cfg : 25 | S -> A S | epsilon, 26 | A -> A begin A end | A open A close | epsilon 27 | 28 | @fail { 29 | System.out.println("improper use of files"); 30 | } 31 | } 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/CFG/SafeFile/SafeFile_1/SafeFile_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/CFG/SafeFile/SafeFile_1/SafeFile_1.expected.err -------------------------------------------------------------------------------- /examples/CFG/SafeFile/SafeFile_1/SafeFile_1.expected.out: -------------------------------------------------------------------------------- 1 | begin 2 | open 3 | close 4 | end 5 | begin 6 | open 7 | end 8 | improper use of files 9 | improper use of files 10 | begin 11 | close 12 | improper use of files 13 | end 14 | improper use of files 15 | improper use of files 16 | -------------------------------------------------------------------------------- /examples/CFG/SafeFile/SafeFile_2/SafeFile_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/CFG/SafeFile/SafeFile_2/SafeFile_2.expected.err -------------------------------------------------------------------------------- /examples/CFG/SafeFile/SafeFile_2/SafeFile_2.expected.out: -------------------------------------------------------------------------------- 1 | begin 2 | open 3 | close 4 | end 5 | begin 6 | open 7 | close 8 | end 9 | begin 10 | open 11 | close 12 | end 13 | begin 14 | open 15 | close 16 | end 17 | begin 18 | open 19 | close 20 | end 21 | begin 22 | open 23 | close 24 | end 25 | begin 26 | open 27 | close 28 | end 29 | begin 30 | open 31 | close 32 | end 33 | begin 34 | open 35 | close 36 | end 37 | -------------------------------------------------------------------------------- /examples/CFG/SafeFileWriter/SafeFileWriter.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | ////Violation Test 3 | package mop; 4 | 5 | import java.io.*; 6 | import java.util.*; 7 | 8 | // This property specifies a situation in which a 9 | // program writes a file after it is closed. It 10 | // should be monitored using @match because the 11 | // pattern specifies the unsafe behavior. 12 | // This property is borrowed from tracematches, 13 | // where it was expressed as a the regular expression 14 | // 'create write* close write' 15 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers) 16 | 17 | SafeFileWriter(FileWriter f) { 18 | 19 | event open after() returning(FileWriter f) : 20 | call(FileWriter.new(..)) {} 21 | event write before(FileWriter f) : 22 | call(* write(..)) && target(f) {} 23 | event close after(FileWriter f) : 24 | call(* close(..)) && target(f) {} 25 | 26 | cfg : 27 | S -> open SafeWrite close write, 28 | SafeWrite -> SafeWrite S | SafeWrite write | epsilon 29 | 30 | @match { 31 | System.out.println("write after close"); 32 | } 33 | } 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /examples/CFG/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/CFG/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.err -------------------------------------------------------------------------------- /examples/CFG/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.out: -------------------------------------------------------------------------------- 1 | write after close 2 | write after close 3 | write after close 4 | -------------------------------------------------------------------------------- /examples/CFG/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/CFG/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.err -------------------------------------------------------------------------------- /examples/CFG/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/CFG/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.out -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | ere : (hasnext hasnext* next)* 24 | 25 | @fail { 26 | System.err.println( 27 | "! hasNext() has not been called" 28 | + " before calling next() for an" 29 | + " iterator"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_1/HasNext_1.expected.err: -------------------------------------------------------------------------------- 1 | ! hasNext() has not been called before calling next() for an iterator 2 | ! hasNext() has not been called before calling next() for an iterator 3 | ! hasNext() has not been called before calling next() for an iterator 4 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_1/HasNext_1.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_2/HasNext_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/HasNext/HasNext_2/HasNext_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_2/HasNext_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_3/HasNext_3.expected.err: -------------------------------------------------------------------------------- 1 | ! hasNext() has not been called before calling next() for an iterator 2 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_3/HasNext_3.expected.out: -------------------------------------------------------------------------------- 1 | sum = 3 2 | -------------------------------------------------------------------------------- /examples/ERE/HasNext/HasNext_3/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.io.*; 3 | import java.util.*; 4 | 5 | // This property specifies a case in 6 | // which the hasnext method is not 7 | // called before calling the next method, 8 | // i.e. next is called twice in a row. 9 | // It is monitored for the match condition 10 | // and requires suffix matching to work 11 | // properly. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | suffix HasNext(Iterator i) { 16 | event hasnext 17 | before(Iterator i) : 18 | call(* Iterator.hasNext()) 19 | && target(i) {} 20 | event next before(Iterator i) : 21 | call(* Iterator.next()) 22 | && target(i) {} 23 | 24 | ere : next next 25 | 26 | @match { 27 | System.err.println( 28 | "@:" + __LOC + " ! hasNext not called before next"); 29 | __RESET; 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2_1/HasNext2_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext2_1 { 5 | public static void main(String[] args) { 6 | Vector v = new Vector(); 7 | v.add(1); 8 | v.add(2); 9 | 10 | Iterator i = v.iterator(); 11 | int sum = 0; 12 | 13 | if (i.hasNext()) { 14 | sum += (Integer)i.next(); 15 | // JavaMOP should match "next next" on the following event 16 | sum += (Integer)i.next(); 17 | } 18 | 19 | System.out.println("sum: " + sum); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2_1/HasNext2_1.output: -------------------------------------------------------------------------------- 1 | sum: 3 2 | @:HasNext2_1.java:15 ! hasNext not called before next 3 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2_2/HasNext2_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext2_2 { 5 | public static void main(String[] args) { 6 | Vector v = new Vector(); 7 | v.add(1); 8 | v.add(2); 9 | 10 | Iterator i = v.iterator(); 11 | int sum = 0; 12 | 13 | // JavaMOP should not match "next next" 14 | if (i.hasNext()) { 15 | sum += (Integer)i.next(); 16 | } 17 | 18 | System.out.println("sum: " + sum); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2_2/HasNext2_2.output: -------------------------------------------------------------------------------- 1 | sum: 1 2 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2_3/HasNext2_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext2_3 { 5 | public static void main(String[] args) { 6 | Vector v = new Vector(); 7 | v.add(1); 8 | v.add(2); 9 | v.add(3); 10 | 11 | Iterator i = v.iterator(); 12 | int sum = 0; 13 | 14 | // Regardless of the number of "hasNext" events, 15 | // "next" "next" should be matched. 16 | i.hasNext(); 17 | i.hasNext(); 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | i.hasNext(); 22 | i.hasNext(); 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/ERE/HasNext2/HasNext2_3/HasNext2_3.output: -------------------------------------------------------------------------------- 1 | sum: 6 2 | @:HasNext2_3.java:18 ! hasNext not called before next 3 | @:HasNext2_3.java:19 ! hasNext not called before next 4 | 5 | -------------------------------------------------------------------------------- /examples/ERE/HashSet/HashSet_1/HashSet_1.output: -------------------------------------------------------------------------------- 1 | contains 1 : true 2 | HashCode changed for Object HashSet_1$Item@6c11b92 while being in a Hashtable! 3 | -------------------------------------------------------------------------------- /examples/ERE/HashSet/HashSet_2/HashSet_2.output: -------------------------------------------------------------------------------- 1 | contains 1 : true 2 | contains 2 : false 3 | -------------------------------------------------------------------------------- /examples/ERE/PasswordLogin/MessageDigestClass/MessageDigestClass.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.security.*; 3 | import java.io.*; 4 | 5 | 6 | public class MessageDigestClass { 7 | 8 | public static void main(String[] args) throws Exception { 9 | // Create a Message Digest from a Factory method 10 | MessageDigest md = MessageDigest.getInstance("SHA-1"); 11 | 12 | //This part is commented so that the property of message digest is violated. 13 | /* 14 | * String Password = "Get In"; 15 | * byte[] msg = Password.getBytes(); 16 | * md.update(msg); */ 17 | 18 | byte[] aMessageDigest = md.digest(); 19 | 20 | // Printout 21 | // System.out.println("Original: " + new String(msg)); 22 | // System.out.println("Message Digest: " + new String(aMessageDigest)); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /examples/ERE/PasswordLogin/MessageDigestClass/MessageDigestClass.output: -------------------------------------------------------------------------------- 1 | Problem in Message Digest has occurred! 2 | -------------------------------------------------------------------------------- /examples/ERE/PasswordLogin/PasswordLogin.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | import java.security.*; 7 | 8 | // This property monitors appropriate handling to generate message digest. 9 | 10 | MsgDigest(MessageDigest P) { 11 | event getInstance after(MessageDigest P) : 12 | call(* MessageDigest.getInstance()) && target(P) {} 13 | 14 | event update after(MessageDigest P) : 15 | call(* MessageDigest.update()) && 16 | target(P) {} 17 | 18 | event reset before(MessageDigest P) : 19 | call(* MessageDigest.reset()) && 20 | target(P) {} 21 | 22 | event digest before(MessageDigest P) : 23 | call(* MessageDigest.digest()) && 24 | target(P) {} 25 | 26 | ere : getInstance update (update* reset* update* digest)* 27 | 28 | @fail { 29 | System.err.println("Problem in Message Digest has occurred!"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | 8 | // The SafeEnum property is designed 9 | // to match a case where a Collection 10 | // with an associated Enumeration is 11 | // modified while the Enumeration is 12 | // in use. 13 | 14 | full-binding SafeEnum(Vector v, Enumeration e) { 15 | 16 | event create after(Vector v) 17 | returning(Enumeration e) : 18 | call(Enumeration Vector+.elements()) 19 | && target(v) {} 20 | event updatesource after(Vector v) : 21 | (call(* Vector+.remove*(..)) 22 | || call(* Vector+.add*(..)) 23 | || call(* Vector+.clear(..)) 24 | || call(* Vector+.insertElementAt(..)) 25 | || call(* Vector+.set*(..)) 26 | || call(* Vector+.retainAll(..))) 27 | && target(v){} 28 | event next before(Enumeration e) : 29 | call(* Enumeration+.nextElement()) 30 | && target(e){} 31 | 32 | 33 | ere : create next* updatesource updatesource* next 34 | 35 | @match { 36 | System.out.println("improper enumeration usage at " + __LOC); 37 | __RESET; 38 | } 39 | } 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum_1/SafeEnum_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeEnum/SafeEnum_1/SafeEnum_1.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum_1/SafeEnum_1.expected.out: -------------------------------------------------------------------------------- 1 | improper enumeration usage at SafeEnum_1.main(SafeEnum_1.java:24) 2 | sum: 26 3 | -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum_1/SafeEnum_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | if(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | v.add(11); 21 | } 22 | 23 | while(e.hasMoreElements()){ 24 | sum += (Integer)e.nextElement(); 25 | } 26 | 27 | v.clear(); 28 | 29 | System.out.println("sum: " + sum); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum_2/SafeEnum_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeEnum/SafeEnum_2/SafeEnum_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum_2/SafeEnum_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/ERE/SafeEnum/SafeEnum_2/SafeEnum_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | while(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | } 21 | 22 | v.add(11); 23 | v.clear(); 24 | 25 | System.out.println("sum: " + sum); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/ERE/SafeFileWriter/SafeFileWriter.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The SafeFile property is designed to 8 | // match a case where a file is written 9 | // after it is closed. 10 | 11 | SafeFileWriter(FileWriter f) { 12 | static int counter = 0; 13 | int writes = 0; 14 | 15 | event open after() returning(FileWriter f) : 16 | call(FileWriter.new(..)) { 17 | this.writes = 0; 18 | } 19 | event write before(FileWriter f) : 20 | call(* write(..)) && target(f) { 21 | this.writes ++; 22 | } 23 | event close after(FileWriter f) : 24 | call(* close(..)) && target(f) {} 25 | 26 | ere : (open write write* close)* 27 | 28 | @fail { 29 | System.out.println("write after close"); 30 | __RESET; 31 | } 32 | @match { 33 | System.out.println((++(counter)) 34 | + ":" + writes); 35 | } 36 | } 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /examples/ERE/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.out: -------------------------------------------------------------------------------- 1 | 1:3 2 | 2:2 3 | 3:2 4 | 4:2 5 | 5:3 6 | write after close 7 | write after close 8 | write after close 9 | -------------------------------------------------------------------------------- /examples/ERE/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.out: -------------------------------------------------------------------------------- 1 | 1:3 2 | 2:2 3 | 3:2 4 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncCollection/SafeSyncCollection_1/SafeSyncCollection_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeSyncCollection/SafeSyncCollection_1/SafeSyncCollection_1.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeSyncCollection/SafeSyncCollection_1/SafeSyncCollection_1.expected.out: -------------------------------------------------------------------------------- 1 | pattern matched! 2 | Foo 3 | Bar 4 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncCollection/SafeSyncCollection_1/SafeSyncCollection_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeSyncCollection_1 { 5 | public static void main(String[] args){ 6 | ArrayList list = new ArrayList(); 7 | Collection c = list; 8 | c = Collections.synchronizedCollection(c); 9 | 10 | list.add("Foo"); 11 | list.add("Bar"); 12 | Iterator i = c.iterator(); 13 | while(i.hasNext()){ 14 | System.out.println(i.next()); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncCollection/SafeSyncCollection_2/SafeSyncCollection_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeSyncCollection/SafeSyncCollection_2/SafeSyncCollection_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeSyncCollection/SafeSyncCollection_2/SafeSyncCollection_2.expected.out: -------------------------------------------------------------------------------- 1 | lists--- 2 | pattern matched! 3 | Foo 4 | Bar 5 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncCollection/SafeSyncCollection_2/SafeSyncCollection_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeSyncCollection_2 { 5 | public static void main(String[] args){ 6 | ArrayList list = new ArrayList(); 7 | list.add("Foo"); 8 | list.add("Bar"); 9 | 10 | Collection c = list; 11 | c = Collections.synchronizedCollection(list); 12 | 13 | Iterator i = null; 14 | synchronized(c){ 15 | i = c.iterator(); 16 | } 17 | 18 | System.out.println("lists---"); 19 | while(i.hasNext()){ 20 | System.out.println(i.next()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncMap/SafeSyncMap_1/SafeSyncMap_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeSyncMap/SafeSyncMap_1/SafeSyncMap_1.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeSyncMap/SafeSyncMap_1/SafeSyncMap_1.expected.out: -------------------------------------------------------------------------------- 1 | Bar 2 | Foo 3 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncMap/SafeSyncMap_1/SafeSyncMap_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeSyncMap_1 { 5 | public static void main(String[] args){ 6 | Map testMap = new LinkedHashMap(); 7 | testMap = Collections.synchronizedMap(testMap); 8 | synchronized (testMap) { 9 | testMap.put("Foo", "Bar"); 10 | testMap.put("Bar", "Foo"); 11 | Set keys = testMap.keySet(); 12 | Iterator i = keys.iterator(); 13 | while(i.hasNext()){ 14 | System.out.println(testMap.get(i.next())); 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncMap/SafeSyncMap_2/SafeSyncMap_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/SafeSyncMap/SafeSyncMap_2/SafeSyncMap_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/SafeSyncMap/SafeSyncMap_2/SafeSyncMap_2.expected.out: -------------------------------------------------------------------------------- 1 | synchronized collection accessed in non threadsafe manner! 2 | Bar 3 | Foo 4 | -------------------------------------------------------------------------------- /examples/ERE/SafeSyncMap/SafeSyncMap_2/SafeSyncMap_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeSyncMap_2 { 5 | public static void main(String[] args){ 6 | Map testMap = new LinkedHashMap(); 7 | testMap = Collections.synchronizedMap(testMap); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | while(i.hasNext()){ 13 | System.out.println(testMap.get(i.next())); 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | suffix HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : call(* Iterator.hasNext()) && target(i) {} 17 | event next before(Iterator i) : call(* Iterator.next()) && target(i) {} 18 | 19 | ere : next next 20 | 21 | @match { 22 | System.err.println("! hasNext() not called before calling next()"); 23 | __RESET; 24 | } 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext_1/HasNext_1.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | ! hasNext() not called before calling next() 3 | ! hasNext() not called before calling next() 4 | ! hasNext() not called before calling next() 5 | ! hasNext() not called before calling next() 6 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext_2/HasNext_2.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | 3 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext_3/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/ERE/SuffixHasNext/HasNext_3/HasNext_3.output: -------------------------------------------------------------------------------- 1 | sum = 3 2 | ! hasNext() not called before calling next() 3 | 4 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | UnsafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | event updatesource after(Collection c) : 18 | (call(* Collection+.remove*(..)) 19 | || call(* Collection+.add*(..)) ) && target(c) {} 20 | event next before(Iterator i) : 21 | call(* Iterator.next()) && target(i) {} 22 | 23 | ere : create next* updatesource updatesource* next 24 | 25 | @match { 26 | System.out.println("improper iterator usage"); 27 | } 28 | } 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator_1/UnsafeIterator_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/UnsafeIterator/UnsafeIterator_1/UnsafeIterator_1.expected.err -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator_1/UnsafeIterator_1.expected.out: -------------------------------------------------------------------------------- 1 | improper iterator usage 2 | 45 3 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator_1/UnsafeIterator_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class UnsafeIterator_1 { 5 | public static void main(String[] args){ 6 | Set testSet = new HashSet(); 7 | for(int i = 0; i < 10; ++i){ 8 | testSet.add(new Integer(i)); 9 | } 10 | Iterator i = testSet.iterator(); 11 | 12 | int output = 0; 13 | for(int j = 0; j < 10 && i.hasNext(); ++j){ 14 | output += (Integer)i.next(); 15 | testSet.add(new Integer(j)); 16 | } 17 | System.out.println(output); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator_2/UnsafeIterator_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/UnsafeIterator/UnsafeIterator_2/UnsafeIterator_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator_2/UnsafeIterator_2.expected.out: -------------------------------------------------------------------------------- 1 | 45 2 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeIterator/UnsafeIterator_2/UnsafeIterator_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class UnsafeIterator_2 { 5 | public static void main(String[] args){ 6 | Set testSet = new HashSet(); 7 | for(int i = 0; i < 10; ++i){ 8 | testSet.add(new Integer(i)); 9 | } 10 | Iterator i = testSet.iterator(); 11 | 12 | int output = 0; 13 | for(int j = 0; j < 10 && i.hasNext(); ++j){ 14 | output += (Integer)i.next(); 15 | } 16 | System.out.println(output); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeMapIterator/UnsafeMapIterator_1/UnsafeMapIterator_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/UnsafeMapIterator/UnsafeMapIterator_1/UnsafeMapIterator_1.expected.err -------------------------------------------------------------------------------- /examples/ERE/UnsafeMapIterator/UnsafeMapIterator_1/UnsafeMapIterator_1.expected.out: -------------------------------------------------------------------------------- 1 | unsafe iterator usage! 2 | java found the problem too 3 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeMapIterator/UnsafeMapIterator_1/UnsafeMapIterator_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class UnsafeMapIterator_1 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new HashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | testMap.put("breaker", "borked"); 13 | System.out.println(i.next()); 14 | } 15 | catch(Exception e){ 16 | System.out.println("java found the problem too"); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeMapIterator/UnsafeMapIterator_2/UnsafeMapIterator_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/ERE/UnsafeMapIterator/UnsafeMapIterator_2/UnsafeMapIterator_2.expected.err -------------------------------------------------------------------------------- /examples/ERE/UnsafeMapIterator/UnsafeMapIterator_2/UnsafeMapIterator_2.expected.out: -------------------------------------------------------------------------------- 1 | Foo 2 | -------------------------------------------------------------------------------- /examples/ERE/UnsafeMapIterator/UnsafeMapIterator_2/UnsafeMapIterator_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class UnsafeMapIterator_2 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new LinkedHashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | System.out.println(i.next()); 13 | } 14 | catch(Exception e){ 15 | System.out.println("java found the problem too"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/EndProgram/FileClose/FileClose.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | 8 | FileClose(FileWriter f) { 9 | FileWriter saved_fw; 10 | creation event write before(FileWriter f) : call(* FileWriter+.write(..)) && target(f) { 11 | saved_fw = f; 12 | } 13 | event close after(FileWriter f) : call(* FileWriter+.close(..)) && target(f) { 14 | } 15 | 16 | event endProg before() : endProgram() { 17 | System.out.println("Program has ended."); 18 | } 19 | 20 | ere : write* close+ endProg 21 | 22 | @fail { 23 | System.err.println("You should close the file you wrote."); 24 | try{ 25 | saved_fw.close(); 26 | } catch(Exception e){ 27 | System.err.println(e.getMessage()); 28 | } 29 | __RESET; 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /examples/EndProgram/FileClose/FileClose_1/FileClose_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/EndProgram/FileClose/FileClose_1/FileClose_1.expected.err -------------------------------------------------------------------------------- /examples/EndProgram/FileClose/FileClose_1/FileClose_1.expected.out: -------------------------------------------------------------------------------- 1 | Program has ended. 2 | Program has ended. 3 | Program has ended. 4 | Program has ended. 5 | Program has ended. 6 | -------------------------------------------------------------------------------- /examples/EndProgram/FileClose/FileClose_2/FileClose_2.expected.err: -------------------------------------------------------------------------------- 1 | You should close the file you wrote. 2 | You should close the file you wrote. 3 | -------------------------------------------------------------------------------- /examples/EndProgram/FileClose/FileClose_2/FileClose_2.expected.out: -------------------------------------------------------------------------------- 1 | Program has ended. 2 | Program has ended. 3 | Program has ended. 4 | Program has ended. 5 | Program has ended. 6 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | 8 | HasNext(Iterator i) { 9 | creation event hasnext after(Iterator i) : 10 | call(* Iterator.hasNext()) 11 | && target(i) {} 12 | creation event next before(Iterator i) : 13 | call(* Iterator.next()) 14 | && target(i) {} 15 | event endProg before() : endProgram() 16 | {System.out.println("Program has ended.");} 17 | 18 | ere : (hasnext+ next)* hasnext* endProg 19 | 20 | @fail { 21 | System.err.println( 22 | "! hasNext() has not been called" 23 | + " before calling next() for an" 24 | + " iterator"); 25 | __RESET; 26 | } 27 | } 28 | 29 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext_1/HasNext_1.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | Program has ended. 3 | ! hasNext() has not been called before calling next() for an iterator 4 | ! hasNext() has not been called before calling next() for an iterator 5 | ! hasNext() has not been called before calling next() for an iterator 6 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext_2/HasNext_2.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | Program has ended. 3 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext_3/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/EndProgram/HasNext/HasNext_3/HasNext_3.output: -------------------------------------------------------------------------------- 1 | sum = 3 2 | Program has ended. 3 | ! hasNext() has not been called before calling next() for an iterator 4 | -------------------------------------------------------------------------------- /examples/ErrorMessages/SameEventNames/UnsafeIterator.err: -------------------------------------------------------------------------------- 1 | Events with the same name should have the same parameters -------------------------------------------------------------------------------- /examples/ErrorMessages/SameEventNames/UnsafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | UnsafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | 18 | event updatesource after(Collection c) : 19 | call(* Collection+.remove*(..)) && target(c) {} 20 | event updatesource after() : 21 | call(* Collection+.add*(..)) {} 22 | 23 | event next before(Iterator i) : 24 | call(* Iterator.next()) && target(i) {} 25 | 26 | ere : create next* updatesource updatesource* next 27 | 28 | @match { 29 | System.out.println("improper iterator usage"); 30 | } 31 | } 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/ErrorMessages/UnknownLogic/UnsafeIterator.err: -------------------------------------------------------------------------------- 1 | Logic Plugin Not Found -------------------------------------------------------------------------------- /examples/ErrorMessages/UnknownLogic/UnsafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | UnsafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | 18 | event updatesource after(Collection c) : 19 | (call(* Collection+.remove*(..)) || call(* Collection+.add*(..))) && target(c) {} 20 | 21 | event next before(Iterator i) : 22 | call(* Iterator.next()) && target(i) {} 23 | 24 | unknown : create next* updatesource updatesource* next 25 | 26 | @match { 27 | System.out.println("improper iterator usage"); 28 | } 29 | } 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/ErrorMessages/WrongHandler/UnsafeIterator.err: -------------------------------------------------------------------------------- 1 | not a supported state in this logic -------------------------------------------------------------------------------- /examples/ErrorMessages/WrongHandler/UnsafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | UnsafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | 18 | event updatesource after(Collection c) : 19 | (call(* Collection+.remove*(..)) || call(* Collection+.add*(..))) && target(c) {} 20 | 21 | event next before(Iterator i) : 22 | call(* Iterator.next()) && target(i) {} 23 | 24 | ere : create next* updatesource updatesource* next 25 | 26 | @unknown { 27 | System.out.println("improper iterator usage"); 28 | } 29 | } 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program does 8 | // not call the hasnext method before the next 9 | // method of an iterator. 10 | // This property is borrowed from tracematches 11 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers) 12 | 13 | full-binding HasNext(Iterator i) { 14 | event hasnext after(Iterator i) : 15 | call(* Iterator.hasNext()) && target(i) {} 16 | event next before(Iterator i) : 17 | call(* Iterator.next()) && target(i) {} 18 | 19 | fsm : 20 | start [ 21 | next -> unsafe 22 | hasnext -> safe 23 | ] 24 | safe [ 25 | next -> start 26 | hasnext -> safe 27 | ] 28 | unsafe [ 29 | next -> unsafe 30 | hasnext -> safe 31 | ] 32 | 33 | alias match = unsafe 34 | 35 | @match { 36 | System.out.println("next called without hasNext!"); 37 | } 38 | } 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext_1/HasNext_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/FSM/HasNext/HasNext_1/HasNext_1.expected.err -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext_1/HasNext_1.expected.out: -------------------------------------------------------------------------------- 1 | next called without hasNext! 2 | next called without hasNext! 3 | next called without hasNext! 4 | next called without hasNext! 5 | sum: 15 6 | -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | sum += (Integer)i.next(); 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | 22 | System.out.println("sum: " + sum); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext_2/HasNext_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/FSM/HasNext/HasNext_2/HasNext_2.expected.err -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext_2/HasNext_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/FSM/HasNext/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program does 8 | // not call the hasnext method before the next 9 | // method of an iterator. 10 | // This is a simpler version of HasNext that 11 | // must be monitored using an @fail handler 12 | // because the fsm specifies correct behavior. 13 | 14 | HasNext2(Iterator i) { 15 | event hasnext after(Iterator i) : 16 | call(* Iterator.hasNext()) && target(i) {} 17 | event next before(Iterator i) : 18 | call(* Iterator.next()) && target(i) {} 19 | 20 | fsm : 21 | start [ 22 | hasnext -> safe 23 | ] 24 | safe [ 25 | next -> start 26 | hasnext -> safe 27 | ] 28 | 29 | @fail { 30 | System.out.println("next called without hasNext!"); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_1/HasNext2_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/FSM/HasNext2/HasNext2_1/HasNext2_1.expected.err -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_1/HasNext2_1.expected.out: -------------------------------------------------------------------------------- 1 | next called without hasNext! 2 | sum: 3 3 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_1/HasNext2_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext2_1 { 5 | public static void main(String[] args) { 6 | Vector v = new Vector(); 7 | v.add(1); 8 | v.add(2); 9 | 10 | Iterator i = v.iterator(); 11 | int sum = 0; 12 | 13 | if (i.hasNext()) { 14 | sum += (Integer)i.next(); 15 | // JavaMOP should match "next next" on the following event 16 | sum += (Integer)i.next(); 17 | } 18 | 19 | System.out.println("sum: " + sum); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_2/HasNext2_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/FSM/HasNext2/HasNext2_2/HasNext2_2.expected.err -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_2/HasNext2_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 1 2 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_2/HasNext2_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext2_2 { 5 | public static void main(String[] args) { 6 | Vector v = new Vector(); 7 | v.add(1); 8 | v.add(2); 9 | 10 | Iterator i = v.iterator(); 11 | int sum = 0; 12 | 13 | // JavaMOP should not match "next next" 14 | if (i.hasNext()) { 15 | sum += (Integer)i.next(); 16 | } 17 | 18 | System.out.println("sum: " + sum); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_3/HasNext2_3.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/FSM/HasNext2/HasNext2_3/HasNext2_3.expected.err -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_3/HasNext2_3.expected.out: -------------------------------------------------------------------------------- 1 | next called without hasNext! 2 | sum: 3 3 | -------------------------------------------------------------------------------- /examples/FSM/HasNext2/HasNext2_3/HasNext2_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class HasNext2_3 { 5 | public static void main(String[] args) { 6 | Vector v = new Vector(); 7 | v.add(1); 8 | v.add(2); 9 | 10 | Iterator i = v.iterator(); 11 | int sum = 0; 12 | 13 | // Regardless of the number of "hasNext" events, 14 | // "next" "next" should be matched. 15 | i.hasNext(); 16 | i.hasNext(); 17 | sum += (Integer)i.next(); 18 | sum += (Integer)i.next(); 19 | 20 | System.out.println("sum: " + sum); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property requires that hasnext be called before next 8 | // and that hasnext return true. It is a modification of the 9 | // HasNext property from tracematches 10 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers), 11 | // with the modification requiring hasnext to return true 12 | 13 | HasNext(Iterator i) { 14 | 15 | event hasnexttrue after(Iterator i) returning(boolean b) : 16 | call(* Iterator.hasNext()) 17 | && target(i) && condition(b) { } 18 | event hasnextfalse after(Iterator i) returning(boolean b) : 19 | call(* Iterator.hasNext()) 20 | && target(i) && condition(!b) { } 21 | event next before(Iterator i) : 22 | call(* Iterator.next()) 23 | && target(i) { } 24 | 25 | ltl: [](next => (*) hasnexttrue) 26 | 27 | @violation { System.out.println("ltl violated!");} 28 | 29 | } 30 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_1/HasNext_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/HasNext/HasNext_1/HasNext_1.expected.err -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_1/HasNext_1.expected.out: -------------------------------------------------------------------------------- 1 | ltl violated! 2 | sum: 15 3 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_2/HasNext_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/HasNext/HasNext_2/HasNext_2.expected.err -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_2/HasNext_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_3/HasNext_3.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/HasNext/HasNext_3/HasNext_3.expected.err -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_3/HasNext_3.expected.out: -------------------------------------------------------------------------------- 1 | ltl violated! 2 | sum = 3 3 | ltl violated! 4 | -------------------------------------------------------------------------------- /examples/LTL/HasNext/HasNext_3/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | package mop; 4 | 5 | import java.io.*; 6 | import java.util.*; 7 | 8 | 9 | // The SafeEnum property is designed 10 | // to match a case where a Collection 11 | // with an associated Enumeration is 12 | // modified while the Enumeration is 13 | // in use. 14 | 15 | full-binding SafeEnum(Vector v, Enumeration e) { 16 | 17 | event create after(Vector v) 18 | returning(Enumeration e) : 19 | call(Enumeration Vector+.elements()) 20 | && target(v) {} 21 | event updatesource after(Vector v) : 22 | (call(* Vector+.remove*(..)) 23 | || call(* Vector+.add*(..)) 24 | || call(* Vector+.clear(..)) 25 | || call(* Vector+.insertElementAt(..)) 26 | || call(* Vector+.set*(..)) 27 | || call(* Vector+.retainAll(..))) 28 | && target(v){} 29 | event next before(Enumeration e) : 30 | call(* Enumeration+.nextElement()) 31 | && target(e){} 32 | 33 | 34 | ltl : [](next => (not updatesource S create)) 35 | 36 | @violation { 37 | System.out.println("improper enumeration usage at " + __LOC); 38 | __RESET; 39 | } 40 | } 41 | 42 | 43 | -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum_1/SafeEnum_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeEnum/SafeEnum_1/SafeEnum_1.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum_1/SafeEnum_1.expected.out: -------------------------------------------------------------------------------- 1 | improper enumeration usage at SafeEnum_1.main(SafeEnum_1.java:24) 2 | improper enumeration usage at SafeEnum_1.main(SafeEnum_1.java:24) 3 | improper enumeration usage at SafeEnum_1.main(SafeEnum_1.java:24) 4 | improper enumeration usage at SafeEnum_1.main(SafeEnum_1.java:24) 5 | sum: 26 6 | -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum_1/SafeEnum_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | if(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | v.add(11); 21 | } 22 | 23 | while(e.hasMoreElements()){ 24 | sum += (Integer)e.nextElement(); 25 | } 26 | 27 | v.clear(); 28 | 29 | System.out.println("sum: " + sum); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum_2/SafeEnum_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeEnum/SafeEnum_2/SafeEnum_2.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum_2/SafeEnum_2.expected.out: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/LTL/SafeEnum/SafeEnum_2/SafeEnum_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | while(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | } 21 | 22 | v.add(11); 23 | v.clear(); 24 | 25 | System.out.println("sum: " + sum); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/LTL/SafeFileWriter/SafeFileWriter.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The SafeFile property is designed to 8 | // match a case where a file is written 9 | // after it is closed. 10 | 11 | SafeFileWriter(FileWriter f) { 12 | static int counter = 0; 13 | int writes = 0; 14 | 15 | event open after() returning(FileWriter f) : 16 | call(FileWriter.new(..)) { 17 | this.writes = 0; 18 | } 19 | event write before(FileWriter f) : 20 | call(* write(..)) && target(f) { 21 | this.writes ++; 22 | } 23 | event close after(FileWriter f) : 24 | call(* close(..)) && target(f) {} 25 | 26 | ltl : [](write => (not close S open)) 27 | 28 | @violation { 29 | System.out.println("write after close"); 30 | } 31 | } 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/LTL/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeFileWriter/SafeFileWriter_1/SafeFileWriter_1.expected.out: -------------------------------------------------------------------------------- 1 | write after close 2 | write after close 3 | write after close 4 | -------------------------------------------------------------------------------- /examples/LTL/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.out: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeFileWriter/SafeFileWriter_2/SafeFileWriter_2.expected.out -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | full-binding SafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | event updatesource after(Collection c) : 18 | (call(* Collection+.remove*(..)) 19 | || call(* Collection+.add*(..)) ) && target(c) {} 20 | event next before(Iterator i) : 21 | call(* Iterator.next()) && target(i) {} 22 | 23 | ltl : [](next => (not updatesource S create)) 24 | 25 | @violation { 26 | System.out.println("improper iterator usage"); 27 | } 28 | } 29 | 30 | 31 | -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator_1/SafeIterator_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeIterator/SafeIterator_1/SafeIterator_1.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator_1/SafeIterator_1.expected.out: -------------------------------------------------------------------------------- 1 | improper iterator usage 2 | 45 3 | -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator_1/SafeIterator_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeIterator_1 { 5 | public static void main(String[] args){ 6 | Set testSet = new HashSet(); 7 | for(int i = 0; i < 10; ++i){ 8 | testSet.add(new Integer(i)); 9 | } 10 | Iterator i = testSet.iterator(); 11 | 12 | int output = 0; 13 | for(int j = 0; j < 10 && i.hasNext(); ++j){ 14 | output += (Integer)i.next(); 15 | testSet.add(new Integer(j)); 16 | } 17 | System.out.println(output); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator_2/SafeIterator_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeIterator/SafeIterator_2/SafeIterator_2.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator_2/SafeIterator_2.expected.out: -------------------------------------------------------------------------------- 1 | 45 2 | -------------------------------------------------------------------------------- /examples/LTL/SafeIterator/SafeIterator_2/SafeIterator_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeIterator_2 { 5 | public static void main(String[] args){ 6 | Set testSet = new HashSet(); 7 | for(int i = 0; i < 10; ++i){ 8 | testSet.add(new Integer(i)); 9 | } 10 | Iterator i = testSet.iterator(); 11 | 12 | int output = 0; 13 | for(int j = 0; j < 10 && i.hasNext(); ++j){ 14 | output += (Integer)i.next(); 15 | } 16 | System.out.println(output); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/LTL/SafeMapIterator/SafeMapIterator_1/SafeMapIterator_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeMapIterator/SafeMapIterator_1/SafeMapIterator_1.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeMapIterator/SafeMapIterator_1/SafeMapIterator_1.expected.out: -------------------------------------------------------------------------------- 1 | unsafe iterator usage! 2 | java found the problem too 3 | -------------------------------------------------------------------------------- /examples/LTL/SafeMapIterator/SafeMapIterator_1/SafeMapIterator_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeMapIterator_1 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new HashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | testMap.put("breaker", "borked"); 13 | System.out.println(i.next()); 14 | } 15 | catch(Exception e){ 16 | System.out.println("java found the problem too"); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/LTL/SafeMapIterator/SafeMapIterator_2/SafeMapIterator_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/LTL/SafeMapIterator/SafeMapIterator_2/SafeMapIterator_2.expected.err -------------------------------------------------------------------------------- /examples/LTL/SafeMapIterator/SafeMapIterator_2/SafeMapIterator_2.expected.out: -------------------------------------------------------------------------------- 1 | Foo 2 | -------------------------------------------------------------------------------- /examples/LTL/SafeMapIterator/SafeMapIterator_2/SafeMapIterator_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeMapIterator_2 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new LinkedHashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | System.out.println(i.next()); 13 | } 14 | catch(Exception e){ 15 | System.out.println("java found the problem too"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/MOPSyntax/AroundAdvice/CheatedSlotMachine.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | import casino.*; 7 | 8 | // The UnsafeIterator property is designed 9 | // to match a case where a Collection that 10 | // is in the process of iteration is modified 11 | // and iteration continues. 12 | 13 | CheatedSlotMachine(SlotMachine machine) { 14 | int num_try = 0; 15 | 16 | event insert_coin after(SlotMachine machine) : 17 | call(* SlotMachine.insertCoin()) && target(machine) {} 18 | event push_button after(SlotMachine machine) : 19 | call(* SlotMachine.push()) && target(machine) { num_try++; } 20 | event result Integer around(SlotMachine machine) : 21 | call(Integer SlotMachine.getResult()) && target(machine) {} 22 | 23 | ere : insert_coin push_button result 24 | 25 | @match { 26 | if((num_try % 3) == 0) __SKIP; 27 | } 28 | } 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /examples/MOPSyntax/AroundAdvice/CheatedSlotMachine_1/CheatedSlotMachine_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package casino; 3 | import java.util.*; 4 | 5 | public class CheatedSlotMachine_1 { 6 | public static void main(String[] args){ 7 | Set testSet = new HashSet(); 8 | for(int i = 0; i < 10; ++i){ 9 | testSet.add(new Integer(i)); 10 | } 11 | Iterator i = testSet.iterator(); 12 | 13 | int output = 0; 14 | for(int j = 0; j < 10 && i.hasNext(); ++j){ 15 | output += (Integer)i.next(); 16 | testSet.add(new Integer(j)); 17 | } 18 | System.out.println(output); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /examples/MOPSyntax/AroundAdvice/CheatedSlotMachine_1/SlotMachine.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package casino; 3 | 4 | public class SlotMachine{ 5 | public void insertCoin(){ 6 | } 7 | public void push(){ 8 | } 9 | public Integer getResult(){ 10 | return null; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | Creation(Object o) { 8 | creation event fun1 after(Object o) : 9 | call(* *.fun1()) && target(o) {} 10 | event fun2 after(Object o) : 11 | call(* *.fun2()) && target(o) {} 12 | event mainend after() : 13 | execution(* *.main(..)) {} 14 | 15 | ere : fun1 (fun1 | fun2)* mainend 16 | 17 | @match { 18 | System.out.println("match"); 19 | } 20 | @fail { 21 | System.out.println("fail"); 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_1/Creation_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/MOPSyntax/Creation/Creation_1/Creation_1.expected.err -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_1/Creation_1.expected.out: -------------------------------------------------------------------------------- 1 | fun1 2 | fun2 3 | main end 4 | match 5 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_1/Creation_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class Creation_1 { 6 | public int temp = 0; 7 | public void fun1(){ 8 | temp = 1; 9 | } 10 | public void fun2(){ 11 | temp = 2; 12 | } 13 | 14 | public static void main(String[] args){ 15 | Creation_1 o = new Creation_1(); 16 | 17 | System.out.println("fun1"); 18 | o.fun1(); 19 | System.out.println("fun2"); 20 | o.fun2(); 21 | 22 | System.out.println("main end"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_2/Creation_2.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/MOPSyntax/Creation/Creation_2/Creation_2.expected.err -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_2/Creation_2.expected.out: -------------------------------------------------------------------------------- 1 | fun2 2 | fun2 3 | fun2 4 | main end 5 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_2/Creation_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class Creation_2 { 6 | public int temp = 0; 7 | public void fun1(){ 8 | temp = 1; 9 | } 10 | public void fun2(){ 11 | temp = 2; 12 | } 13 | 14 | public static void main(String[] args){ 15 | Creation_2 o = new Creation_2(); 16 | 17 | System.out.println("fun2"); 18 | o.fun2(); 19 | System.out.println("fun2"); 20 | o.fun2(); 21 | System.out.println("fun2"); 22 | o.fun2(); 23 | 24 | System.out.println("main end"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_3/Creation_3.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/MOPSyntax/Creation/Creation_3/Creation_3.expected.err -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_3/Creation_3.expected.out: -------------------------------------------------------------------------------- 1 | fun2 2 | fun1 3 | fun2 4 | fun1 5 | main end 6 | match 7 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation/Creation_3/Creation_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class Creation_3 { 6 | public int temp = 0; 7 | public void fun1(){ 8 | temp = 1; 9 | } 10 | public void fun2(){ 11 | temp = 2; 12 | } 13 | 14 | public static void main(String[] args){ 15 | Creation_3 o = new Creation_3(); 16 | 17 | System.out.println("fun2"); 18 | o.fun2(); 19 | System.out.println("fun1"); 20 | o.fun1(); 21 | System.out.println("fun2"); 22 | o.fun2(); 23 | System.out.println("fun1"); 24 | o.fun1(); 25 | 26 | System.out.println("main end"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | Creation(Object o) { 8 | event fun1 after(Object o) : 9 | call(* *.fun1()) && target(o) {} 10 | event fun2 after(Object o) : 11 | call(* *.fun2()) && target(o) {} 12 | event mainend after() : 13 | execution(* *.main(..)) {} 14 | 15 | ere : fun1 (fun1 | fun2)* mainend 16 | 17 | @match { 18 | System.out.println("match"); 19 | } 20 | @fail { 21 | System.out.println("fail"); 22 | } 23 | } 24 | 25 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation_1/Creation_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class Creation_1 { 6 | public int temp = 0; 7 | public void fun1(){ 8 | temp = 1; 9 | } 10 | public void fun2(){ 11 | temp = 2; 12 | } 13 | 14 | public static void main(String[] args){ 15 | Creation_1 o = new Creation_1(); 16 | 17 | System.out.println("fun1"); 18 | o.fun1(); 19 | System.out.println("fun2"); 20 | o.fun2(); 21 | 22 | System.out.println("main end"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation_1/Creation_1.output: -------------------------------------------------------------------------------- 1 | fun1 2 | fun2 3 | main end 4 | match 5 | fail 6 | 7 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation_2/Creation_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class Creation_2 { 6 | public int temp = 0; 7 | public void fun1(){ 8 | temp = 1; 9 | } 10 | public void fun2(){ 11 | temp = 2; 12 | } 13 | 14 | public static void main(String[] args){ 15 | Creation_2 o = new Creation_2(); 16 | 17 | System.out.println("fun2"); 18 | o.fun2(); 19 | System.out.println("fun2"); 20 | o.fun2(); 21 | System.out.println("fun2"); 22 | o.fun2(); 23 | 24 | System.out.println("main end"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation_2/Creation_2.output: -------------------------------------------------------------------------------- 1 | fun2 2 | fail 3 | fun2 4 | fail 5 | fun2 6 | fail 7 | main end 8 | fail 9 | fail 10 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation_3/Creation_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class Creation_3 { 6 | public int temp = 0; 7 | public void fun1(){ 8 | temp = 1; 9 | } 10 | public void fun2(){ 11 | temp = 2; 12 | } 13 | 14 | public static void main(String[] args){ 15 | Creation_3 o = new Creation_3(); 16 | 17 | System.out.println("fun2"); 18 | o.fun2(); 19 | System.out.println("fun1"); 20 | o.fun1(); 21 | System.out.println("fun2"); 22 | o.fun2(); 23 | System.out.println("fun1"); 24 | o.fun1(); 25 | 26 | System.out.println("main end"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Creation2/Creation_3/Creation_3.output: -------------------------------------------------------------------------------- 1 | fun2 2 | fail 3 | fun1 4 | fail 5 | fun2 6 | fail 7 | fun1 8 | fail 9 | main end 10 | fail 11 | fail 12 | -------------------------------------------------------------------------------- /examples/MOPSyntax/EnforceTest/EnforceTest.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | enforce EnforceTest() { 4 | event oneBegin before(): 5 | execution(* Runnable.run(..)) && threadName("T1") { 6 | } 7 | event oneEnd after(): 8 | execution(* Runnable.run(..)) && threadName("T1") { 9 | System.out.println("1 end"); 10 | } 11 | event twoBegin before(): 12 | execution(* Runnable.run(..)) && threadName("T2") { 13 | } 14 | event twoEnd after(): 15 | execution(* Runnable.run(..)) && threadName("T2") { 16 | System.out.println("2 end"); 17 | } 18 | ere : twoBegin+ twoEnd+ oneBegin+ oneEnd+ 19 | 20 | @nonfail { 21 | // System.out.println("success!"); 22 | } 23 | @deadlock { 24 | System.out.println("deadlock!"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/MOPSyntax/EnforceTest/EnforceTest_1/EnforceTest_1.expected.err: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/MOPSyntax/EnforceTest/EnforceTest_1/EnforceTest_1.expected.err -------------------------------------------------------------------------------- /examples/MOPSyntax/EnforceTest/EnforceTest_1/EnforceTest_1.expected.out: -------------------------------------------------------------------------------- 1 | Thread T2 2 | 2 end 3 | 2 end 4 | Thread T1 5 | 1 end 6 | 1 end 7 | -------------------------------------------------------------------------------- /examples/MOPSyntax/EnforceTest/EnforceTest_1/EnforceTest_1.java: -------------------------------------------------------------------------------- 1 | public class EnforceTest_1 implements Runnable { 2 | public void run(){ 3 | System.out.println("Thread " + Thread.currentThread().getName()); 4 | } 5 | 6 | public static void main(String args[]) throws Exception{ 7 | 8 | Thread t1 = new Thread (new EnforceTest_1()); 9 | Thread t2 = new Thread (new EnforceTest_1()); 10 | t1.setName("T1"); 11 | t2.setName("T2"); 12 | 13 | t1.start(); 14 | t2.start(); 15 | 16 | t1.join(); 17 | t2.join(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | 17 | event create after(Collection c) 18 | returning(Iterator i) : 19 | call(Iterator Collection+.iterator()) && target(c) {} 20 | event hasnext after(Iterator i) : 21 | call(* Iterator.hasNext()) 22 | && target(i) {} 23 | event next before(Iterator i) : 24 | call(* Iterator.next()) 25 | && target(i) {} 26 | 27 | ere : create (hasnext hasnext* next)* 28 | 29 | @fail { 30 | System.err.println("! hasNext() has not been called" 31 | + " before calling next() for an" 32 | + " iterator"); 33 | __RESET; 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext_1/HasNext_1.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | ! hasNext() has not been called before calling next() for an iterator 3 | ! hasNext() has not been called before calling next() for an iterator 4 | ! hasNext() has not been called before calling next() for an iterator 5 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext_2/HasNext_2.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext_3/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/MOPSyntax/ExtendedEventParameters/HasNext_3/HasNext_3.output: -------------------------------------------------------------------------------- 1 | sum = 3 2 | ! hasNext() has not been called before calling next() for an iterator 3 | ! hasNext() has not been called before calling next() for an iterator 4 | -------------------------------------------------------------------------------- /examples/MOPSyntax/MOP_Name/some-bad-name.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program does 8 | // not call the hasnext method before the next 9 | // method of an iterator. 10 | // This property is borrowed from tracematches 11 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers) 12 | 13 | full-binding some-bad-name(Iterator i) { 14 | event hasnext after(Iterator i) : 15 | call(* Iterator.hasNext()) && target(i) {} 16 | event next before(Iterator i) : 17 | call(* Iterator.next()) && target(i) {} 18 | 19 | fsm : 20 | start [ 21 | next -> unsafe 22 | hasnext -> safe 23 | ] 24 | safe [ 25 | next -> start 26 | hasnext -> safe 27 | ] 28 | unsafe [ 29 | next -> unsafe 30 | hasnext -> safe 31 | ] 32 | 33 | alias match = unsafe 34 | 35 | @match { 36 | System.out.println("next called without hasNext!"); 37 | } 38 | } 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | perthread HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | ere : (hasnext hasnext* next)* 24 | 25 | @fail { 26 | System.err.println( 27 | "! hasNext() has not been called" 28 | + " before calling next() for an" 29 | + " iterator"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext_1/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext_1/HasNext_1.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | ! hasNext() has not been called before calling next() for an iterator 3 | ! hasNext() has not been called before calling next() for an iterator 4 | ! hasNext() has not been called before calling next() for an iterator 5 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext_2/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext_2/HasNext_2.output: -------------------------------------------------------------------------------- 1 | sum: 15 2 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext_3/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/MOPSyntax/PerThread/HasNext_3/HasNext_3.output: -------------------------------------------------------------------------------- 1 | sum = 3 2 | ! hasNext() has not been called before calling next() for an iterator 3 | 4 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Pointcut/Comparable_CompareToNull.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.lang.*; 5 | import com.runtimeverification.rvmonitor.java.rt.RVMLogging; 6 | import com.runtimeverification.rvmonitor.java.rt.RVMLogging.Level; 7 | 8 | /** 9 | * Warns if a comparable object is compared to null. 10 | * 11 | * According to the manual, null is not an instance of any class; it cannot be compared to any object. 12 | * http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29 13 | * 14 | * @severity error 15 | */ 16 | 17 | Comparable_CompareToNull() { 18 | event nullcompare before(Object o) : call(* Comparable+.compareTo(..)) && args(o) && if(o == null) { 19 | RVMLogging.out.println(Level.CRITICAL, __DEFAULT_MESSAGE); 20 | RVMLogging.out.println(Level.CRITICAL, "null cannot be compared to any object"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Pointcut/Comparable_CompareToNullException.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.lang.*; 5 | import com.runtimeverification.rvmonitor.java.rt.RVMLogging; 6 | import com.runtimeverification.rvmonitor.java.rt.RVMLogging.Level; 7 | 8 | /** 9 | * Warns if a comparable object does not throw a NullPointerException when compared to null. 10 | * 11 | * According to the manual, compareTo(null) should throw a NullPointerException. 12 | * http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29 13 | * 14 | * @severity error 15 | */ 16 | 17 | Comparable_CompareToNullException() { 18 | 19 | event badexception after(Object o) throwing(Exception e) : call(* Comparable+.compareTo(..)) 20 | && args(o) && if(o == null) && condition(!(e instanceof NullPointerException)) { 21 | RVMLogging.out.println(Level.CRITICAL, __DEFAULT_MESSAGE); 22 | RVMLogging.out.println(Level.CRITICAL, "NullPointerException should be thrown when an object is compared to null"); 23 | } 24 | event badcompare after(Object o) returning(int i) : call(* Comparable+.compareTo(..)) 25 | && args(o) && if(o == null) { 26 | RVMLogging.out.println(Level.CRITICAL, __DEFAULT_MESSAGE); 27 | RVMLogging.out.println(Level.CRITICAL, "NullPointerException should be thrown when an object is compared to null"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /examples/MOPSyntax/Raw/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | 24 | raw 25 | : 26 | if(false) {} 27 | else 28 | System.out.println("Iterator "+i+ " invokes some method"); 29 | } 30 | 31 | -------------------------------------------------------------------------------- /examples/MOPSyntax/StaticEvent/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | static event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | ere : (hasnext hasnext* next)* 24 | 25 | @fail { 26 | System.err.println( 27 | "! hasNext() has not been called" 28 | + " before calling next() for an" 29 | + " iterator"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/agent/.gitignore: -------------------------------------------------------------------------------- 1 | *.jar 2 | *.rvm 3 | *.class 4 | -------------------------------------------------------------------------------- /examples/agent/HasNext/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/agent/HasNext/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/agent/HasNext/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/agent/HasNext/rvm/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | ere : (hasnext hasnext* next)* 24 | 25 | @fail { 26 | System.err.println( 27 | "! hasNext() has not been called" 28 | + " before calling next() for an" 29 | + " iterator"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/agent/README: -------------------------------------------------------------------------------- 1 | The agent generation feature has been removed from javamop, and delegated to the new tool 2 | "javamopagent". See docs/JavaMOPAgentUsage.md at javamop's top directory for details. 3 | -------------------------------------------------------------------------------- /examples/agent/SafeEnum/SafeEnum_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | if(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | v.add(11); 21 | } 22 | 23 | while(e.hasMoreElements()){ 24 | sum += (Integer)e.nextElement(); 25 | } 26 | 27 | v.clear(); 28 | 29 | System.out.println("sum: " + sum); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/agent/SafeEnum/SafeEnum_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | while(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | } 21 | 22 | v.add(11); 23 | v.clear(); 24 | 25 | System.out.println("sum: " + sum); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/agent/SafeEnum/rvm/SafeEnum.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | 8 | // The SafeEnum property is designed 9 | // to match a case where a Collection 10 | // with an associated Enumeration is 11 | // modified while the Enumeration is 12 | // in use. 13 | 14 | full-binding SafeEnum(Vector v, Enumeration e) { 15 | 16 | event create after(Vector v) 17 | returning(Enumeration e) : 18 | call(Enumeration Vector+.elements()) 19 | && target(v) {} 20 | event updatesource after(Vector v) : 21 | (call(* Vector+.remove*(..)) 22 | || call(* Vector+.add*(..)) 23 | || call(* Vector+.clear(..)) 24 | || call(* Vector+.insertElementAt(..)) 25 | || call(* Vector+.set*(..)) 26 | || call(* Vector+.retainAll(..))) 27 | && target(v){} 28 | event next before(Enumeration e) : 29 | call(* Enumeration+.nextElement()) 30 | && target(e){} 31 | 32 | 33 | ere : create next* updatesource updatesource* next 34 | 35 | @match { 36 | System.out.println("improper enumeration usage at " + __LOC); 37 | __RESET; 38 | } 39 | } 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /examples/agent/SafeFile/rvm/SafeFile.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // SafeFile is designed to match nested, matched 8 | // open closes within a method. This follows the 9 | // software engineering practice of closing files 10 | // within the method they are opened. It should 11 | // be monitored with an @fail handler, because 12 | // the CFG specifies the correct behavior. 13 | 14 | SafeFile(FileReader f, Thread t) { 15 | event open after(Thread t) returning(FileReader f) : 16 | call(FileReader.new(..)) && thread(t){} 17 | event close after(FileReader f, Thread t) : 18 | call(* FileReader.close(..)) && target(f) && thread(t){} 19 | event begin before(Thread t) : 20 | execution(* *.*(..)) && thread(t) {} 21 | event end after(Thread t) : 22 | execution(* *.*(..)) && thread(t) {} 23 | 24 | cfg : 25 | S -> A S | epsilon, 26 | A -> A begin A end | A open A close | epsilon 27 | 28 | @fail { 29 | System.out.println("improper use of files"); 30 | } 31 | } 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/agent/SafeMapIterator/SafeMapIterator_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeMapIterator_1 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new HashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | testMap.put("breaker", "borked"); 13 | System.out.println(i.next()); 14 | } 15 | catch(Exception e){ 16 | System.out.println("java found the problem too"); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/agent/SafeMapIterator/SafeMapIterator_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeMapIterator_2 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new HashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | System.out.println(i.next()); 13 | } 14 | catch(Exception e){ 15 | System.out.println("java found the problem too"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/agent/all-java-api-properties.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/examples/agent/all-java-api-properties.jar -------------------------------------------------------------------------------- /examples/agent/many/HasNext_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | if(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | sum += (Integer)i.next(); 20 | sum += (Integer)i.next(); 21 | sum += (Integer)i.next(); 22 | } 23 | 24 | System.out.println("sum: " + sum); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /examples/agent/many/HasNext_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Iterator i = v.iterator(); 15 | int sum = 0; 16 | 17 | while(i.hasNext()){ 18 | sum += (Integer)i.next(); 19 | } 20 | 21 | System.out.println("sum: " + sum); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/agent/many/HasNext_3.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class HasNext_3 { 6 | public static void main(String[] args) { 7 | Vector v = new Vector(); 8 | v.add(1); v.add(2); 9 | Iterator it = v.iterator(); 10 | while(it.hasNext()) { 11 | int sum = (Integer)it.next() + (Integer)it.next(); 12 | System.out.println("sum = " + sum); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/agent/many/SafeEnum_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_1 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | if(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | v.add(11); 21 | } 22 | 23 | while(e.hasMoreElements()){ 24 | sum += (Integer)e.nextElement(); 25 | } 26 | 27 | v.clear(); 28 | 29 | System.out.println("sum: " + sum); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/agent/many/SafeEnum_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.util.*; 4 | 5 | public class SafeEnum_2 { 6 | public static void main(String[] args){ 7 | Vector v = new Vector(); 8 | 9 | v.add(1); 10 | v.add(2); 11 | v.add(4); 12 | v.add(8); 13 | 14 | Enumeration e = v.elements(); 15 | 16 | int sum = 0; 17 | 18 | while(e.hasMoreElements()){ 19 | sum += (Integer)e.nextElement(); 20 | } 21 | 22 | v.add(11); 23 | v.clear(); 24 | 25 | System.out.println("sum: " + sum); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/agent/many/SafeFile_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | public class SafeFile_2{ 7 | 8 | static FileReader fr = null; 9 | 10 | public static void sub1(){ 11 | System.out.println("begin"); 12 | 13 | File file = null; 14 | try{ 15 | file = File.createTempFile("javamoptest1", ".tmp"); 16 | FileWriter fw_1 = new FileWriter(file); 17 | fw_1.write("testing\n"); 18 | fw_1.close(); 19 | } catch (Exception e){ 20 | System.out.println(e.getMessage()); 21 | } 22 | 23 | try{ 24 | System.out.println("open"); 25 | fr = new FileReader(file); 26 | } catch (Exception e){ 27 | } 28 | try{ 29 | System.out.println("close"); 30 | fr.close(); 31 | } catch (Exception e){ 32 | } 33 | System.out.println("end"); 34 | } 35 | 36 | public static void sub2(){ 37 | sub1(); 38 | sub1(); 39 | } 40 | 41 | public static void main(String[] args){ 42 | for(int i = 0; i < 5; i++){ 43 | sub1(); 44 | } 45 | 46 | for(int i = 0; i < 2; i++){ 47 | sub2(); 48 | } 49 | 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /examples/agent/many/SafeMapIterator_1.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeMapIterator_1 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new HashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | testMap.put("breaker", "borked"); 13 | System.out.println(i.next()); 14 | } 15 | catch(Exception e){ 16 | System.out.println("java found the problem too"); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /examples/agent/many/SafeMapIterator_2.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | import java.util.*; 3 | 4 | public class SafeMapIterator_2 { 5 | public static void main(String[] args){ 6 | try{ 7 | Map testMap = new HashMap(); 8 | testMap.put("Foo", "Bar"); 9 | testMap.put("Bar", "Foo"); 10 | Set keys = testMap.keySet(); 11 | Iterator i = keys.iterator(); 12 | System.out.println(i.next()); 13 | } 14 | catch(Exception e){ 15 | System.out.println("java found the problem too"); 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/cfg/SafeFile.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // SafeFile is designed to match nested, matched 8 | // open closes within a method. This follows the 9 | // software engineering practice of closing files 10 | // within the method they are opened. It should 11 | // be monitored with an @fail handler, because 12 | // the CFG specifies the correct behavior. 13 | 14 | SafeFile(FileReader f, Thread t) { 15 | event open after(Thread t) returning(FileReader f) : 16 | call(FileReader.new(..)) && thread(t){} 17 | event close after(FileReader f, Thread t) : 18 | call(* FileReader.close(..)) && target(f) && thread(t){} 19 | event begin before(Thread t) : 20 | execution(* *.*(..)) && thread(t) {} 21 | event end after(Thread t) : 22 | execution(* *.*(..)) && thread(t) {} 23 | 24 | cfg : 25 | S -> A S | epsilon, 26 | A -> A begin A end | A open A close | epsilon 27 | 28 | @fail { 29 | System.out.println("improper use of files"); 30 | } 31 | } 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/cfg/SafeFileWriter.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | ////Violation Test 3 | package mop; 4 | 5 | import java.io.*; 6 | import java.util.*; 7 | 8 | // This property specifies a situation in which a 9 | // program writes a file after it is closed. It 10 | // should be monitored using @match because the 11 | // pattern specifies the unsafe behavior. 12 | // This property is borrowed from tracematches, 13 | // where it was expressed as a the regular expression 14 | // 'create write* close write' 15 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers) 16 | 17 | SafeFileWriter(FileWriter f) { 18 | 19 | event open after() returning(FileWriter f) : 20 | call(FileWriter.new(..)) {} 21 | event write before(FileWriter f) : 22 | call(* write(..)) && target(f) {} 23 | event close after(FileWriter f) : 24 | call(* close(..)) && target(f) {} 25 | 26 | cfg : 27 | S -> open SafeWrite close write, 28 | SafeWrite -> SafeWrite S | SafeWrite write | epsilon 29 | 30 | @match { 31 | System.out.println("write after close"); 32 | } 33 | } 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/ere/FileClose.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | 8 | FileClose(FileWriter f) { 9 | FileWriter saved_fw; 10 | creation event write before(FileWriter f) : call(* FileWriter+.write(..)) && target(f) { 11 | saved_fw = f; 12 | } 13 | event close after(FileWriter f) : call(* FileWriter+.close(..)) && target(f) { 14 | } 15 | 16 | event endProg before() : endProgram() { 17 | System.out.println("Program has ended."); 18 | } 19 | 20 | ere : write* close+ endProg 21 | 22 | @fail { 23 | System.err.println("You should close the file you wrote."); 24 | try{ 25 | saved_fw.close(); 26 | } catch(Exception e){ 27 | System.err.println(e.getMessage()); 28 | } 29 | __RESET; 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/ere/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | 17 | event create after(Collection c) 18 | returning(Iterator i) : 19 | call(Iterator Collection+.iterator()) && target(c) {} 20 | event hasnext after(Iterator i) : 21 | call(* Iterator.hasNext()) 22 | && target(i) {} 23 | event next before(Iterator i) : 24 | call(* Iterator.next()) 25 | && target(i) {} 26 | 27 | ere : create (hasnext hasnext* next)* 28 | 29 | @fail { 30 | System.err.println("! hasNext() has not been called" 31 | + " before calling next() for an" 32 | + " iterator"); 33 | __RESET; 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/ere/PasswordLogin.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | import java.security.*; 7 | 8 | // This property monitors appropriate handling to generate message digest. 9 | 10 | MsgDigest(MessageDigest P) { 11 | event getInstance after(MessageDigest P) : 12 | call(* MessageDigest.getInstance()) && target(P) {} 13 | 14 | event update after(MessageDigest P) : 15 | call(* MessageDigest.update()) && 16 | target(P) {} 17 | 18 | event reset before(MessageDigest P) : 19 | call(* MessageDigest.reset()) && 20 | target(P) {} 21 | 22 | event digest before(MessageDigest P) : 23 | call(* MessageDigest.digest()) && 24 | target(P) {} 25 | 26 | ere : getInstance update (update* reset* update* digest)* 27 | 28 | @fail { 29 | System.err.println("Problem in Message Digest has occurred!"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/ere/UnsafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | UnsafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | 18 | event updatesource after(Collection c) : 19 | (call(* Collection+.remove*(..)) || call(* Collection+.add*(..))) && target(c) {} 20 | 21 | event next before(Iterator i) : 22 | call(* Iterator.next()) && target(i) {} 23 | 24 | ere : create next* updatesource updatesource* next 25 | 26 | @match { 27 | System.out.println("improper iterator usage"); 28 | } 29 | } 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/ltl/SafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | full-binding SafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | event updatesource after(Collection c) : 18 | (call(* Collection+.remove*(..)) 19 | || call(* Collection+.add*(..)) ) && target(c) {} 20 | event next before(Iterator i) : 21 | call(* Iterator.next()) && target(i) {} 22 | 23 | ltl : [](next => (not updatesource S create)) 24 | 25 | @violation { 26 | System.out.println("improper iterator usage"); 27 | } 28 | } 29 | 30 | 31 | -------------------------------------------------------------------------------- /examples/agent/many/rvm/output/readme.txt: -------------------------------------------------------------------------------- 1 | This is a folder used in testing phase only. 2 | -------------------------------------------------------------------------------- /examples/javamopagent/HasNext.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program 8 | // always calls the hasnext method before 9 | // the next method of an iterator. 10 | // It is monitored for the pattern fail 11 | // condition. This property is borrowed 12 | // from tracematches (see ECOOP'07 13 | // http://abc.comlab.ox.ac.uk/papers) 14 | 15 | HasNext(Iterator i) { 16 | event hasnext after(Iterator i) : 17 | call(* Iterator.hasNext()) 18 | && target(i) {} 19 | event next before(Iterator i) : 20 | call(* Iterator.next()) 21 | && target(i) {} 22 | 23 | ere : (hasnext hasnext* next)* 24 | 25 | @fail { 26 | System.err.println( 27 | "! hasNext() has not been called" 28 | + " before calling next() for an" 29 | + " iterator"); 30 | __RESET; 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/README.md: -------------------------------------------------------------------------------- 1 | We are currently keeping a log of our thoughts on improving JavaMOP in this [Google Docs folder](https://drive.google.com/?tab=mo&authuser=0#folders/0BwIDJ5BfbU_fUll6SWtWTVFnY2s). Please let us know if you'd like access. 2 | 3 | -------------------------------------------------------------------------------- /src/main/java/javamop/output/Package.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.output; 3 | 4 | import javamop.parser.ast.MOPSpecFile; 5 | 6 | /** 7 | * A package declaration string. 8 | */ 9 | class Package { 10 | private final String packageString; 11 | 12 | /** 13 | * Retrieve the package from a specification file. 14 | * @param mopSpecFile The specification to retrieve the package from. 15 | */ 16 | public Package(MOPSpecFile mopSpecFile) { 17 | if (mopSpecFile.getPakage() != null) { 18 | packageString = mopSpecFile.getPakage().toString().trim(); 19 | } else { 20 | packageString = ""; 21 | } 22 | } 23 | 24 | /** 25 | * The package declaration. 26 | * @return The package declaration string. 27 | */ 28 | @Override 29 | public String toString(){ 30 | return packageString; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/output/combinedaspect/GlobalLock.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.output.combinedaspect; 3 | 4 | import javamop.output.MOPVariable; 5 | 6 | /** 7 | * A globally available lock for use in the generated code. 8 | */ 9 | public class GlobalLock { 10 | private final MOPVariable lock; 11 | 12 | /** 13 | * Assign a variable to be a global lock. 14 | * @param lock The variable to use. 15 | */ 16 | public GlobalLock(final MOPVariable lock) { 17 | this.lock = lock; 18 | } 19 | 20 | /** 21 | * The variable being used as a lock. 22 | * @return The lock variable. 23 | */ 24 | public MOPVariable getName() { 25 | return lock; 26 | } 27 | 28 | /** 29 | * Generate declarations for the global lock to be made. 30 | */ 31 | @Override 32 | public String toString() { 33 | String ret = ""; 34 | 35 | ret += "static ReentrantLock " + lock + " = new ReentrantLock();\n"; 36 | ret += "static Condition " + lock + "_cond = " + lock + ".newCondition();\n"; 37 | 38 | return ret; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/javamop/output/combinedaspect/event/advice/AroundAdviceLocalDecl.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.output.combinedaspect.event.advice; 3 | 4 | import javamop.output.MOPVariable; 5 | 6 | /** 7 | * Generates a declaration for whether to skip the around advice or not. 8 | */ 9 | public class AroundAdviceLocalDecl { 10 | 11 | private final MOPVariable skipAroundAdvice; 12 | 13 | /** 14 | * Construct the declaration. 15 | */ 16 | public AroundAdviceLocalDecl(){ 17 | skipAroundAdvice = new MOPVariable("MOP_skipAroundAdvice"); 18 | } 19 | 20 | /** 21 | * The java declaration for if the around advice should be skipped. 22 | * @return A java source code declaration. 23 | */ 24 | @Override 25 | public String toString() { 26 | return "boolean " + skipAroundAdvice + " = false;\n"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/Main.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser; 3 | 4 | import java.io.File; 5 | 6 | import javamop.parser.ast.MOPSpecFile; 7 | import javamop.parser.astex.MOPSpecFileExt; 8 | import javamop.parser.main_parser.JavaMOPParser; 9 | 10 | public class Main { 11 | 12 | public static void main(String[] args) { 13 | try { 14 | MOPSpecFileExt f = JavaMOPParser.parse(new File(args[0])); 15 | MOPSpecFile o = JavaMOPExtender.translateMopSpecFile(f); 16 | 17 | System.out.print(o.toString()); 18 | } catch (Exception e) { 19 | e.printStackTrace(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/ArgsPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.VoidVisitor; 6 | 7 | import java.util.List; 8 | 9 | public class ArgsPointCut extends PointCut { 10 | 11 | private final List args; 12 | 13 | public ArgsPointCut(int line, int column, String type, List args){ 14 | super(line, column, type); 15 | this.args = args; 16 | } 17 | 18 | public List getArgs() { return args; } 19 | 20 | @Override 21 | public void accept(VoidVisitor v, A arg) { 22 | v.visit(this, arg); 23 | } 24 | 25 | @Override 26 | public R accept(GenericVisitor v, A arg) { 27 | return v.visit(this, arg); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/BaseTypePattern.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.VoidVisitor; 6 | 7 | public class BaseTypePattern extends TypePattern { 8 | 9 | public BaseTypePattern(int line, int column, String op) { 10 | super(line, column, op); 11 | } 12 | 13 | @Override 14 | public void accept(VoidVisitor v, A arg) { 15 | v.visit(this, arg); 16 | } 17 | 18 | @Override 19 | public R accept(GenericVisitor v, A arg) { 20 | return v.visit(this, arg); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/CFlowPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class CFlowPointCut extends PointCut { 9 | 10 | private final PointCut pointcut; 11 | 12 | public CFlowPointCut(int line, int column, String type, PointCut pointcut){ 13 | super(line, column, type); 14 | this.pointcut = pointcut; 15 | } 16 | 17 | public PointCut getPointCut() { return pointcut; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/CombinedPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.PointcutVisitor; 7 | import javamop.parser.ast.visitor.VoidVisitor; 8 | 9 | import java.util.List; 10 | 11 | public class CombinedPointCut extends PointCut { 12 | 13 | private final List pointcuts; 14 | 15 | public CombinedPointCut(int line, int column, String type, List pointcuts){ 16 | super(line, column, type); 17 | 18 | this.pointcuts = pointcuts; 19 | } 20 | 21 | public List getPointcuts() { return pointcuts; } 22 | 23 | @Override 24 | public void accept(VoidVisitor v, A arg) { 25 | v.visit(this, arg); 26 | } 27 | 28 | @Override 29 | public R accept(GenericVisitor v, A arg) { 30 | return v.visit(this, arg); 31 | } 32 | 33 | @Override 34 | public R accept(PointcutVisitor v, A arg) { 35 | return v.visit(this, arg); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/CombinedTypePattern.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import java.util.List; 5 | 6 | import javamop.parser.ast.visitor.GenericVisitor; 7 | import javamop.parser.ast.visitor.VoidVisitor; 8 | 9 | public class CombinedTypePattern extends TypePattern { 10 | 11 | private final List sub_types; 12 | 13 | public CombinedTypePattern(int line, int column, String op, List sub_types){ 14 | super(line, column, op); 15 | this.sub_types = sub_types; 16 | } 17 | 18 | public List getSubTypes() { return sub_types; } 19 | 20 | @Override 21 | public void accept(VoidVisitor v, A arg) { 22 | v.visit(this, arg); 23 | } 24 | 25 | @Override 26 | public R accept(GenericVisitor v, A arg) { 27 | return v.visit(this, arg); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/ConditionPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.expr.Expression; 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.PointcutVisitor; 7 | import javamop.parser.ast.visitor.VoidVisitor; 8 | 9 | public class ConditionPointCut extends PointCut { 10 | 11 | private final Expression expr; 12 | 13 | public ConditionPointCut(int line, int column, String type, Expression expr) { 14 | super(line, column, type); 15 | this.expr = expr; 16 | } 17 | 18 | public Expression getExpression() { return expr; } 19 | 20 | @Override 21 | public void accept(VoidVisitor v, A arg) { 22 | v.visit(this, arg); 23 | } 24 | 25 | @Override 26 | public R accept(GenericVisitor v, A arg) { 27 | return v.visit(this, arg); 28 | } 29 | 30 | @Override 31 | public R accept(PointcutVisitor v, A arg) { 32 | return v.visit(this, arg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/CountCondPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.expr.Expression; 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.PointcutVisitor; 7 | import javamop.parser.ast.visitor.VoidVisitor; 8 | 9 | public class CountCondPointCut extends PointCut { 10 | 11 | private final Expression expr; 12 | 13 | public CountCondPointCut(int line, int column, String type, Expression expr) { 14 | super(line, column, type); 15 | this.expr = expr; 16 | } 17 | 18 | public Expression getExpression() { return expr; } 19 | 20 | @Override 21 | public void accept(VoidVisitor v, A arg) { 22 | v.visit(this, arg); 23 | } 24 | 25 | @Override 26 | public R accept(GenericVisitor v, A arg) { 27 | return v.visit(this, arg); 28 | } 29 | 30 | @Override 31 | public R accept(PointcutVisitor v, A arg) { 32 | return v.visit(this, arg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/EndObjectPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class EndObjectPointCut extends PointCut { 9 | 10 | private final TypePattern targetType; 11 | private final String id; 12 | 13 | public EndObjectPointCut(int line, int column, TypePattern targetType, String id){ 14 | super(line, column, "endObject"); 15 | this.targetType = targetType; 16 | this.id = id; 17 | } 18 | public TypePattern getTargetType() { return targetType; } 19 | 20 | public String getId() { return id; } 21 | 22 | @Override 23 | public void accept(VoidVisitor v, A arg) { 24 | v.visit(this, arg); 25 | } 26 | 27 | @Override 28 | public R accept(GenericVisitor v, A arg) { 29 | return v.visit(this, arg); 30 | } 31 | 32 | @Override 33 | public R accept(PointcutVisitor v, A arg) { 34 | return v.visit(this, arg); 35 | } 36 | } -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/EndProgramPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class EndProgramPointCut extends PointCut { 9 | 10 | public EndProgramPointCut(int line, int column){ 11 | super(line, column, "endProgram"); 12 | } 13 | @Override 14 | public void accept(VoidVisitor v, A arg) { 15 | v.visit(this, arg); 16 | } 17 | 18 | @Override 19 | public R accept(GenericVisitor v, A arg) { 20 | return v.visit(this, arg); 21 | } 22 | 23 | @Override 24 | public R accept(PointcutVisitor v, A arg) { 25 | return v.visit(this, arg); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/EndThreadPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class EndThreadPointCut extends PointCut { 9 | 10 | public EndThreadPointCut(int line, int column){ 11 | super(line, column, "endThread"); 12 | } 13 | 14 | @Override 15 | public void accept(VoidVisitor v, A arg) { 16 | v.visit(this, arg); 17 | } 18 | 19 | @Override 20 | public R accept(GenericVisitor v, A arg) { 21 | return v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(PointcutVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/FieldPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class FieldPointCut extends PointCut { 9 | 10 | private final FieldPattern field; 11 | 12 | public FieldPointCut(int line, int column, String type, FieldPattern field){ 13 | super(line, column, type); 14 | this.field = field; 15 | } 16 | 17 | public FieldPattern getField() { return field; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/IDPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | import java.util.List; 9 | 10 | public class IDPointCut extends PointCut { 11 | 12 | private final List args; 13 | private final String id; 14 | 15 | public IDPointCut(int line, int column, String id, List args){ 16 | super(line, column, "id"); 17 | this.args = args; 18 | this.id = id; 19 | } 20 | 21 | public List getArgs() { return args; } 22 | public String getId() { return id; } 23 | 24 | @Override 25 | public void accept(VoidVisitor v, A arg) { 26 | v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(GenericVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | 34 | @Override 35 | public R accept(PointcutVisitor v, A arg) { 36 | return v.visit(this, arg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/IFPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.expr.Expression; 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.PointcutVisitor; 7 | import javamop.parser.ast.visitor.VoidVisitor; 8 | 9 | public class IFPointCut extends PointCut { 10 | 11 | private final Expression expr; 12 | 13 | public IFPointCut(int line, int column, String type, Expression expr) { 14 | super(line, column, type); 15 | this.expr = expr; 16 | } 17 | 18 | public Expression getExpression() { return expr; } 19 | 20 | @Override 21 | public void accept(VoidVisitor v, A arg) { 22 | v.visit(this, arg); 23 | } 24 | 25 | @Override 26 | public R accept(GenericVisitor v, A arg) { 27 | return v.visit(this, arg); 28 | } 29 | 30 | @Override 31 | public R accept(PointcutVisitor v, A arg) { 32 | return v.visit(this, arg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/MethodPattern.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.VoidVisitor; 6 | 7 | import java.util.List; 8 | 9 | public class MethodPattern extends FieldPattern { 10 | 11 | private final List parameters; 12 | private final List throwTypes; 13 | 14 | public MethodPattern(int line, int column, int modifiers, int not_modifiers, TypePattern type, TypePattern owner, String name, List parameters, List throwTypes){ 15 | super(line, column, modifiers, not_modifiers, type, owner, name); 16 | this.parameters = parameters; 17 | this.throwTypes = throwTypes; 18 | } 19 | 20 | public List getParameters() { return parameters; } 21 | public List getThrows() { return throwTypes; } 22 | 23 | @Override 24 | public void accept(VoidVisitor v, A arg) { 25 | v.visit(this, arg); 26 | } 27 | 28 | @Override 29 | public R accept(GenericVisitor v, A arg) { 30 | return v.visit(this, arg); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/MethodPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class MethodPointCut extends PointCut { 9 | 10 | private final MethodPattern signature; 11 | 12 | public MethodPointCut(int line, int column, String type, MethodPattern signature) { 13 | super(line, column, type); 14 | this.signature = signature; 15 | } 16 | 17 | public MethodPattern getSignature() { 18 | return signature; 19 | } 20 | 21 | @Override 22 | public void accept(VoidVisitor v, A arg) { 23 | v.visit(this, arg); 24 | } 25 | 26 | @Override 27 | public R accept(GenericVisitor v, A arg) { 28 | return v.visit(this, arg); 29 | } 30 | 31 | @Override 32 | public R accept(PointcutVisitor v, A arg) { 33 | return v.visit(this, arg); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/NotPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class NotPointCut extends PointCut { 9 | 10 | private final PointCut pointcut; 11 | 12 | public NotPointCut(int line, int column, PointCut pointcut) { 13 | super(line, column, "!"); 14 | this.pointcut = pointcut; 15 | } 16 | 17 | public PointCut getPointCut() { return pointcut; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/NotTypePattern.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.VoidVisitor; 6 | 7 | public class NotTypePattern extends TypePattern { 8 | 9 | private final TypePattern type; 10 | 11 | public NotTypePattern(int line, int column, TypePattern type){ 12 | super(line, column, "!"); 13 | this.type = type; 14 | } 15 | 16 | public TypePattern getType() { return type; } 17 | 18 | @Override 19 | public void accept(VoidVisitor v, A arg) { 20 | v.visit(this, arg); 21 | } 22 | 23 | @Override 24 | public R accept(GenericVisitor v, A arg) { 25 | return v.visit(this, arg); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/PointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.Node; 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.PointcutVisitor; 7 | import javamop.parser.ast.visitor.VoidVisitor; 8 | 9 | public abstract class PointCut extends Node { 10 | 11 | private final String type; 12 | 13 | public PointCut(int line, int column, String type){ 14 | super(line, column); 15 | this.type = type; 16 | } 17 | 18 | public String getType() { return type; } 19 | 20 | @Override 21 | public void accept(VoidVisitor v, A arg) { 22 | v.visit(this, arg); 23 | } 24 | 25 | @Override 26 | public R accept(GenericVisitor v, A arg) { 27 | return v.visit(this, arg); 28 | } 29 | 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/StartThreadPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class StartThreadPointCut extends PointCut { 9 | 10 | public StartThreadPointCut(int line, int column){ 11 | super(line, column, "startThread"); 12 | } 13 | 14 | @Override 15 | public void accept(VoidVisitor v, A arg) { 16 | v.visit(this, arg); 17 | } 18 | 19 | @Override 20 | public R accept(GenericVisitor v, A arg) { 21 | return v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(PointcutVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/TargetPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class TargetPointCut extends PointCut { 9 | 10 | private final TypePattern target; 11 | 12 | public TargetPointCut(int line, int column, String type, TypePattern target){ 13 | super(line, column, type); 14 | this.target = target; 15 | } 16 | 17 | public TypePattern getTarget() { return target; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/ThisPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class ThisPointCut extends PointCut { 9 | 10 | private final TypePattern target; 11 | 12 | public ThisPointCut(int line, int column, String type, TypePattern target){ 13 | super(line, column, type); 14 | this.target = target; 15 | } 16 | public TypePattern getTarget() { return target; } 17 | 18 | @Override 19 | public void accept(VoidVisitor v, A arg) { 20 | v.visit(this, arg); 21 | } 22 | 23 | @Override 24 | public R accept(GenericVisitor v, A arg) { 25 | return v.visit(this, arg); 26 | } 27 | 28 | @Override 29 | public R accept(PointcutVisitor v, A arg) { 30 | return v.visit(this, arg); 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/ThreadBlockedPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | /** 9 | * 10 | * ThreadBlocked point cut used to check whether a thread is blocked 11 | * 12 | * */ 13 | public class ThreadBlockedPointCut extends PointCut { 14 | 15 | private final String id; 16 | 17 | public ThreadBlockedPointCut(int line, int column, String id){ 18 | super(line, column, "threadBlocked"); 19 | this.id = id; 20 | } 21 | 22 | public String getId() { return id; } 23 | 24 | @Override 25 | public void accept(VoidVisitor v, A arg) { 26 | v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(GenericVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | 34 | @Override 35 | public R accept(PointcutVisitor v, A arg) { 36 | return v.visit(this, arg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/ThreadNamePointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | /** 9 | * 10 | * ThreadName point cut used to specify the name of a thread 11 | * 12 | * */ 13 | public class ThreadNamePointCut extends PointCut { 14 | 15 | private final String id; 16 | 17 | public ThreadNamePointCut(int line, int column, String id){ 18 | super(line, column, "threadName"); 19 | this.id = id; 20 | } 21 | 22 | public String getId() { return id; } 23 | 24 | @Override 25 | public void accept(VoidVisitor v, A arg) { 26 | v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(GenericVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | 34 | @Override 35 | public R accept(PointcutVisitor v, A arg) { 36 | return v.visit(this, arg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/ThreadPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class ThreadPointCut extends PointCut { 9 | 10 | private final String id; 11 | 12 | public ThreadPointCut(int line, int column, String id){ 13 | super(line, column, "thread"); 14 | this.id = id; 15 | } 16 | 17 | public String getId() { return id; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/TypePattern.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.Node; 5 | 6 | public abstract class TypePattern extends Node { 7 | 8 | private final String op; 9 | 10 | public TypePattern(int line, int column, String op) { 11 | super(line, column); 12 | this.op = op; 13 | } 14 | 15 | public String getOp() { return op; } 16 | 17 | public boolean equals(Object o){ 18 | if(!(o instanceof TypePattern)){ 19 | return false; 20 | } 21 | 22 | TypePattern t2 = (TypePattern) o; 23 | 24 | return op.equals(t2.getOp()); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/WildcardParameter.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.VoidVisitor; 6 | 7 | public class WildcardParameter extends TypePattern { 8 | 9 | public WildcardParameter(int line, int column) { 10 | super(line, column, ".."); 11 | } 12 | @Override 13 | public void accept(VoidVisitor v, A arg) { 14 | v.visit(this, arg); 15 | } 16 | 17 | @Override 18 | public R accept(GenericVisitor v, A arg) { 19 | return v.visit(this, arg); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/WithinPointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class WithinPointCut extends PointCut { 9 | 10 | private final TypePattern pattern; 11 | 12 | public WithinPointCut(int line, int column, String type, TypePattern pattern){ 13 | super(line, column, type); 14 | this.pattern = pattern; 15 | } 16 | 17 | public TypePattern getPattern() { return pattern; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | @Override 30 | public R accept(PointcutVisitor v, A arg) { 31 | return v.visit(this, arg); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/aspectj/WithincodePointCut.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.aspectj; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.PointcutVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public class WithincodePointCut extends PointCut { 9 | 10 | private final MethodPattern signature; 11 | 12 | public WithincodePointCut(int line, int column, String type, MethodPattern signature){ 13 | super(line, column, type); 14 | this.signature = signature; 15 | } 16 | 17 | public MethodPattern getSignature() { 18 | return signature; 19 | } 20 | 21 | @Override 22 | public void accept(VoidVisitor v, A arg) { 23 | v.visit(this, arg); 24 | } 25 | 26 | @Override 27 | public R accept(GenericVisitor v, A arg) { 28 | return v.visit(this, arg); 29 | } 30 | 31 | @Override 32 | public R accept(PointcutVisitor v, A arg) { 33 | return v.visit(this, arg); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/expr/AnnotationExpr.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | /* 3 | * Copyright (C) 2007 Julio Vilmar Gesser. 4 | * 5 | * This file is part of Java 1.5 parser and Abstract Syntax Tree. 6 | * 7 | * Java 1.5 parser and Abstract Syntax Tree is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU Lesser General Public License as published by 9 | * the Free Software Foundation, either version 3 of the License, or 10 | * (at your option) any later version. 11 | * 12 | * Java 1.5 parser and Abstract Syntax Tree is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU Lesser General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Lesser General Public License 18 | * along with Java 1.5 parser and Abstract Syntax Tree. If not, see . 19 | */ 20 | /* 21 | * Created on 21/11/2006 22 | */ 23 | package javamop.parser.ast.expr; 24 | 25 | /** 26 | * @author Julio Vilmar Gesser 27 | */ 28 | public abstract class AnnotationExpr extends Expression { 29 | 30 | public AnnotationExpr(int line, int column) { 31 | super(line, column); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/expr/LiteralExpr.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | /* 3 | * Copyright (C) 2007 Julio Vilmar Gesser. 4 | * 5 | * This file is part of Java 1.5 parser and Abstract Syntax Tree. 6 | * 7 | * Java 1.5 parser and Abstract Syntax Tree is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU Lesser General Public License as published by 9 | * the Free Software Foundation, either version 3 of the License, or 10 | * (at your option) any later version. 11 | * 12 | * Java 1.5 parser and Abstract Syntax Tree is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU Lesser General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Lesser General Public License 18 | * along with Java 1.5 parser and Abstract Syntax Tree. If not, see . 19 | */ 20 | /* 21 | * Created on 05/10/2006 22 | */ 23 | package javamop.parser.ast.expr; 24 | 25 | /** 26 | * @author Julio Vilmar Gesser 27 | */ 28 | public abstract class LiteralExpr extends Expression { 29 | 30 | public LiteralExpr(int line, int column) { 31 | super(line, column); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/mopspec/Formula.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.mopspec; 3 | 4 | import javamop.parser.ast.visitor.GenericVisitor; 5 | import javamop.parser.ast.visitor.VoidVisitor; 6 | 7 | public class Formula extends Property { 8 | 9 | private final String formula; 10 | 11 | public Formula(int line, int column, String type, String formula) { 12 | super(line, column, type); 13 | this.formula = formula; 14 | } 15 | 16 | public String getFormula() { return formula; } 17 | 18 | @Override 19 | public void accept(VoidVisitor v, A arg) { 20 | v.visit(this, arg); 21 | } 22 | 23 | @Override 24 | public R accept(GenericVisitor v, A arg) { 25 | return v.visit(this, arg); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/mopspec/MOPParameter.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.mopspec; 3 | 4 | import javamop.parser.ast.Node; 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | import javamop.parser.ast.aspectj.*; 8 | 9 | public class MOPParameter extends Node { 10 | private final TypePattern type; 11 | private final String name; 12 | 13 | public MOPParameter (int line, int column, TypePattern type, String name){ 14 | super(line, column); 15 | this.type = type; 16 | this.name = name; 17 | } 18 | 19 | public TypePattern getType() {return type;} 20 | public String getName() {return name;} 21 | 22 | public boolean equals(MOPParameter param){ 23 | return type.equals(param.getType()) && name.equals(param.getName()); 24 | } 25 | 26 | @Override 27 | public int hashCode(){ 28 | return name.hashCode(); 29 | } 30 | 31 | @Override 32 | public void accept(VoidVisitor v, A arg) { 33 | v.visit(this, arg); 34 | } 35 | 36 | @Override 37 | public R accept(GenericVisitor v, A arg) { 38 | return v.visit(this, arg); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/mopspec/Property.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.mopspec; 3 | 4 | import javamop.parser.ast.Node; 5 | import javamop.parser.ast.visitor.GenericVisitor; 6 | import javamop.parser.ast.visitor.VoidVisitor; 7 | 8 | public abstract class Property extends Node { 9 | 10 | private final String type; 11 | 12 | public Property (int line, int column, String type){ 13 | super(line, column); 14 | this.type = type; 15 | } 16 | 17 | public String getType() { return type; } 18 | 19 | @Override 20 | public void accept(VoidVisitor v, A arg) { 21 | v.visit(this, arg); 22 | } 23 | 24 | @Override 25 | public R accept(GenericVisitor v, A arg) { 26 | return v.visit(this, arg); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/type/Type.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | /* 3 | * Copyright (C) 2007 Julio Vilmar Gesser. 4 | * 5 | * This file is part of Java 1.5 parser and Abstract Syntax Tree. 6 | * 7 | * Java 1.5 parser and Abstract Syntax Tree is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU Lesser General Public License as published by 9 | * the Free Software Foundation, either version 3 of the License, or 10 | * (at your option) any later version. 11 | * 12 | * Java 1.5 parser and Abstract Syntax Tree is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU Lesser General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU Lesser General Public License 18 | * along with Java 1.5 parser and Abstract Syntax Tree. If not, see . 19 | */ 20 | /* 21 | * Created on 05/10/2006 22 | */ 23 | package javamop.parser.ast.type; 24 | 25 | import javamop.parser.ast.Node; 26 | 27 | /** 28 | * @author Julio Vilmar Gesser 29 | */ 30 | public abstract class Type extends Node { 31 | 32 | public Type(int line, int column) { 33 | super(line, column); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/ast/visitor/PointcutVisitor.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.ast.visitor; 3 | 4 | import javamop.parser.ast.aspectj.*; 5 | 6 | public interface PointcutVisitor { 7 | 8 | public R visit(PointCut p, A arg); 9 | 10 | public R visit(ArgsPointCut p, A arg); 11 | 12 | public R visit(CombinedPointCut p, A arg); 13 | 14 | public R visit(NotPointCut p, A arg); 15 | 16 | public R visit(ConditionPointCut p, A arg); 17 | 18 | public R visit(FieldPointCut p, A arg); 19 | 20 | public R visit(MethodPointCut p, A arg); 21 | 22 | public R visit(TargetPointCut p, A arg); 23 | 24 | public R visit(ThisPointCut p, A arg); 25 | 26 | public R visit(CFlowPointCut p, A arg); 27 | 28 | public R visit(IFPointCut p, A arg); 29 | 30 | public R visit(IDPointCut p, A arg); 31 | 32 | public R visit(WithinPointCut p, A arg); 33 | 34 | public R visit(WithincodePointCut p, A arg); 35 | 36 | public R visit(ThreadPointCut p, A arg); 37 | 38 | public R visit(ThreadNamePointCut p, A arg); 39 | 40 | public R visit(ThreadBlockedPointCut p, A arg); 41 | 42 | public R visit(EndProgramPointCut p, A arg); 43 | 44 | public R visit(EndThreadPointCut p, A arg); 45 | 46 | public R visit(EndObjectPointCut p, A arg); 47 | 48 | public R visit(StartThreadPointCut p, A arg); 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/astex/mopspec/FormulaExt.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.astex.mopspec; 3 | 4 | import javamop.parser.astex.visitor.GenericVisitor; 5 | import javamop.parser.astex.visitor.VoidVisitor; 6 | 7 | public class FormulaExt extends PropertyExt { 8 | 9 | private final String formula; 10 | 11 | public FormulaExt(int line, int column, String type, String formula, String propertyName) { 12 | super(line, column, type, propertyName); 13 | this.formula = formula; 14 | } 15 | 16 | public String getFormula() { return formula; } 17 | 18 | @Override 19 | public void accept(VoidVisitor v, A arg) { 20 | v.visit(this, arg); 21 | } 22 | 23 | @Override 24 | public R accept(GenericVisitor v, A arg) { 25 | return v.visit(this, arg); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/astex/mopspec/PropertyExt.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.parser.astex.mopspec; 3 | 4 | import javamop.parser.astex.visitor.GenericVisitor; 5 | import javamop.parser.astex.visitor.VoidVisitor; 6 | import javamop.parser.astex.ExtNode; 7 | 8 | public abstract class PropertyExt extends ExtNode { 9 | 10 | private final String type; 11 | private final String propertyName; //soha 12 | 13 | public PropertyExt (int line, int column, String type, String propertyName){ 14 | super(line, column); 15 | this.type = type; 16 | this.propertyName = propertyName; 17 | } 18 | 19 | public String getType() { 20 | return type; 21 | } 22 | 23 | public String getName() { 24 | return propertyName; 25 | } //soha 26 | 27 | @Override 28 | public void accept(VoidVisitor v, A arg) { 29 | v.visit(this, arg); 30 | } 31 | 32 | @Override 33 | public R accept(GenericVisitor v, A arg) { 34 | return v.visit(this, arg); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/javamop/parser/rvm/core/ast/PropertyHandler.java: -------------------------------------------------------------------------------- 1 | package javamop.parser.rvm.core.ast; 2 | 3 | /** 4 | * A handler to invoke on reaching a specific state in a logic property. 5 | * 6 | * @author A. Cody Schuffelen 7 | */ 8 | public class PropertyHandler { 9 | 10 | private final String state; 11 | private final String action; 12 | 13 | /** 14 | * Construct a PropertyHandler out of its component elements. 15 | * 16 | * @param state The state to invoke the handler on. 17 | * @param action The language-specific action to take on entering the state. 18 | */ 19 | public PropertyHandler(final String state, final String action) { 20 | this.state = state; 21 | this.action = action; 22 | } 23 | 24 | /** 25 | * The state to apply the action to. 26 | * 27 | * @return The String name of the state this handler is related to. 28 | */ 29 | public String getState() { 30 | return state; 31 | } 32 | 33 | /** 34 | * The language-specific action to apply on reaching the state. 35 | * 36 | * @return Language-specific code for the action. 37 | */ 38 | public String getAction() { 39 | return action; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/javamop/specfiltering/Configuration.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.specfiltering; 3 | 4 | import java.util.Properties; 5 | 6 | /** 7 | * Interface for all the configurations 8 | */ 9 | interface Configuration { 10 | 11 | /** 12 | * Get all the property settings for the given configuration 13 | * 14 | * @return all the property settings 15 | */ 16 | public Properties getAllSettings(); 17 | 18 | /** 19 | * Get one specific setting from the configuration 20 | * 21 | * @param key the key of the setting 22 | * @return the value of the setting 23 | */ 24 | public String getServerSetting(String key); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/javamop/util/MOPException.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.util; 3 | 4 | /** 5 | * A general exception class signifying something went wrong in the JavaMOP logic. 6 | * @author fengchen 7 | */ 8 | public class MOPException extends Exception { 9 | private static final long serialVersionUID = 2145299315023315212L; 10 | 11 | /** 12 | * Wrap another exception as a MOP logic exception. 13 | * @param e The exception to wrap. 14 | */ 15 | public MOPException(final Exception e){ 16 | super("MOP Expection:" + e.getMessage(), e); 17 | } 18 | 19 | /** 20 | * Construct a MOPException with an informative message. 21 | * @param str An informative message describing the error. 22 | */ 23 | public MOPException(final String str){ 24 | super(str); 25 | } 26 | 27 | /** 28 | * Wrap another exception as a MOP logic exception, with an additional message. 29 | * @param message A descriptive message for the error. 30 | * @param e The exception to be wrapped. 31 | */ 32 | public MOPException(final String message, final Exception e) { 33 | super("MOP Exception: " + message + ": " + e.getMessage(), e); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/javamop/util/Pair.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package javamop.util; 3 | 4 | /** 5 | * A generic immutable Pair class for holding two values of any type. 6 | */ 7 | public class Pair{ 8 | private final A left; 9 | private final B right; 10 | 11 | /** 12 | * Construct the pair. 13 | * @param a The left side of the pair. 14 | * @param b The right side of the pair. 15 | */ 16 | public Pair(final A a, final B b){ 17 | this.left = a; 18 | this.right = b; 19 | } 20 | 21 | /** 22 | * Retrieve the left side of the pair. 23 | * @return The left side. 24 | */ 25 | public A getLeft() { 26 | return left; 27 | } 28 | 29 | /** 30 | * Retrieve the right side of the pair. 31 | * @return The right side 32 | */ 33 | public B getRight() { 34 | return right; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/resources/javamop/parser/main_parser/README: -------------------------------------------------------------------------------- 1 | Make sure not to delete Token.java without copying the realKind variable and the main_parser.Token constructor that takes an aspectj_parser.Token. 2 | realKind is a hack needed by the main_parser. The other constructor is needed because we link together two parsers here. 3 | -------------------------------------------------------------------------------- /src/main/scripts/bin/javamop: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # The below incantation sets SRC_ROOT to be the canonicalized directory of this script 4 | SRC_ROOT=$( 5 | cd -P -- "$(dirname -- "$0")" && 6 | printf '%s\n' "$(pwd -P)/$(basename -- "$0")" 7 | ) || exit 1 8 | SRC_ROOT=`dirname "$SRC_ROOT"` 9 | 10 | # Move up into the actual source root directory 11 | SRC_ROOT="$SRC_ROOT/../" 12 | 13 | RELEASE="$SRC_ROOT/lib" 14 | 15 | PLUGINS_CLASSPATH="$RELEASE/plugins/*" 16 | 17 | LOGICPLUGINPATH="$RELEASE/plugins/" java -cp "$RELEASE/*:$CLASSPATH":"$PLUGINS_CLASSPATH" javamop.JavaMOPMain $@ 18 | 19 | -------------------------------------------------------------------------------- /src/main/scripts/bin/javamop.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | set SRC_ROOT=%~dp0.. 4 | 5 | set RELEASE=%SRC_ROOT%\lib 6 | 7 | set PLUGINS=%RELEASE%\plugins 8 | set LOGICPLUGINPATH=%PLUGINS% 9 | set CP=%RELEASE%\*;%PLUGINS%\* 10 | for /f %%a IN ('dir /b /s "%PLUGINS%\*.jar"') do call %concat% %%a 11 | 12 | java -cp "%CP%;%CLASSPATH%" javamop.JavaMOPMain %* 13 | -------------------------------------------------------------------------------- /src/main/scripts/bin/javamopagent: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # The below incantation sets SRC_ROOT to be the canonicalized directory of this script 4 | SRC_ROOT=$( 5 | cd -P -- "$(dirname -- "$0")" && 6 | printf '%s\n' "$(pwd -P)/$(basename -- "$0")" 7 | ) || exit 1 8 | SRC_ROOT=`dirname "$SRC_ROOT"` 9 | 10 | # Move up into the actual source root directory 11 | SRC_ROOT="$SRC_ROOT/../" 12 | 13 | RELEASE="$SRC_ROOT/lib" 14 | 15 | java -cp "$RELEASE/*:$CLASSPATH":"$PLUGINS_CLASSPATH" javamop.JavaMOPAgentMain $@ 16 | 17 | -------------------------------------------------------------------------------- /src/main/scripts/bin/javamopagent.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | set SRC_ROOT=%~dp0.. 4 | 5 | set RELEASE=%SRC_ROOT%\lib 6 | 7 | set PLUGINS=%RELEASE%\plugins 8 | set LOGICPLUGINPATH=%PLUGINS% 9 | set CP=%RELEASE%\*;%PLUGINS%\* 10 | for /f %%a IN ('dir /b /s "%PLUGINS%\*.jar"') do call %concat% %%a 11 | 12 | java -cp "%CP%;%CLASSPATH%" javamop.JavaMOPAgentMain %* 13 | -------------------------------------------------------------------------------- /src/test/java/system/examples/ExamplesWithNameArgumentIT.java: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package examples; 3 | 4 | import org.apache.commons.lang3.SystemUtils; 5 | import org.junit.Test; 6 | 7 | import java.io.File; 8 | 9 | /** 10 | * Test javamop with -n argument is able to generate .aj file successfully. 11 | */ 12 | 13 | public class ExamplesWithNameArgumentIT { 14 | private final String mopFile = "rvm" + File.separator + "HasNext.mop"; 15 | private final String path = "examples" + File.separator + "agent" + File.separator + "HasNext"; 16 | 17 | private final TestHelper helper = new TestHelper(path + File.separator + mopFile); 18 | 19 | @Test 20 | public void testExampleWithArgs() throws Exception{ 21 | String command = System.getProperty("user.dir") + File.separator + "bin" + File.separator + "javamop"; 22 | if (SystemUtils.IS_OS_WINDOWS) { 23 | command += ".bat"; 24 | } 25 | try { 26 | helper.testCommand(null, false, true, command, "-n", "test", "HasNext.mop"); 27 | } finally { 28 | helper.deleteFiles(true, "testMonitorAspect.aj"); 29 | helper.deleteFiles(true, "HasNext.rvm"); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/unit/javamop/helper/IOUtils.java: -------------------------------------------------------------------------------- 1 | package javamop.helper; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.nio.file.*; 6 | 7 | /** 8 | * Created by xiaohe on 4/15/16. 9 | */ 10 | public class IOUtils { 11 | public static String readFile(String path) throws IOException { 12 | Path inputPath = Paths.get(System.getProperty("user.dir") + File.separator + path); 13 | return new String(Files.readAllBytes(inputPath)); 14 | } 15 | 16 | public static void write2File(String contents, Path outputPath) { 17 | if (outputPath != null) { 18 | try { 19 | outputPath.toFile().getParentFile().mkdirs(); 20 | 21 | Files.write(outputPath, contents.getBytes()); 22 | } catch (IOException e) { 23 | e.printStackTrace(); 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/test/java/unit/javamop/input/HasNext.mo: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // This property specifies that a program does 8 | // not call the hasnext method before the next 9 | // method of an iterator. 10 | // This property is borrowed from tracematches 11 | // (see ECOOP'07 http://abc.comlab.ox.ac.uk/papers) 12 | 13 | full-binding HasNext(Iterator i) { 14 | event hasnext after(Iterator i) : 15 | call(* Iterator.hasNext()) && target(i) {} 16 | event next before(Iterator i) : 17 | call(* Iterator.next()) && target(i) {} 18 | 19 | fsm : 20 | start [ 21 | next -> unsafe 22 | hasnext -> safe 23 | ] 24 | safe [ 25 | next -> start 26 | hasnext -> safe 27 | ] 28 | unsafe [ 29 | next -> unsafe 30 | hasnext -> safe 31 | ] 32 | 33 | alias match = unsafe 34 | 35 | @match { 36 | System.out.println("next called without hasNext!"); 37 | } 38 | } 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/test/java/unit/javamop/input/SafeIterator.mop: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/java/unit/javamop/input/SafeIterator.mop -------------------------------------------------------------------------------- /src/test/resources/Creation.mop.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/resources/Creation.mop.ser -------------------------------------------------------------------------------- /src/test/resources/FileClose.mop.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/resources/FileClose.mop.ser -------------------------------------------------------------------------------- /src/test/resources/HasNext.mop.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/resources/HasNext.mop.ser -------------------------------------------------------------------------------- /src/test/resources/ReadMe.txt: -------------------------------------------------------------------------------- 1 | This folder stores several .ser files which are the serialization form of 2 | MOPSpecFile objects. They are used as testing resources, and the process 3 | of generating these files is described below: 4 | 5 | 1. Clone JavaMOP's git repository and checkout V4.4 6 | ```git clone https://github.com/runtimeverification/javamop.git``` 7 | ```cd javamop``` 8 | ```git checkout 4.4``` 9 | 10 | 2. Run the main method of class ```src\test\java\unit\javamop\helper\MOP_Serialization.java``` 11 | 12 | 3. The output serialization files will be generated in this directory. 13 | 14 | The idea is if we trust the correctness of mop files parsing function provided 15 | in JavaMOP version 4.4, then we can use its results to judge other 'untrusted' 16 | parser implementations. 17 | 18 | We can use the parser in version 4.4 to parse the mop files, generate their 19 | canonical AST representations, and serialize them to files. Later, when we 20 | refactored the parser, we can deserialize the .ser file to get the correct 21 | MOPSpecFile representation of the target mop file, comparing it with the 22 | MOPSpecFile object parsed by the new parser in order to evaluate the 23 | correctness of the new parser. -------------------------------------------------------------------------------- /src/test/resources/SafeFile.mop.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/resources/SafeFile.mop.ser -------------------------------------------------------------------------------- /src/test/resources/SafeFileWriter.mop.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/resources/SafeFileWriter.mop.ser -------------------------------------------------------------------------------- /src/test/resources/UnsafeMapIterator.mop.ser: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/runtimeverification/javamop/f732053b6ed497d1f1135603697bf83061b5c234/src/test/resources/UnsafeMapIterator.mop.ser -------------------------------------------------------------------------------- /src/test/resources/multi-property/UnsafeIterator.mop: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2002-2014 JavaMOP Team. All Rights Reserved. 2 | package mop; 3 | 4 | import java.io.*; 5 | import java.util.*; 6 | 7 | // The UnsafeIterator property is designed 8 | // to match a case where a Collection that 9 | // is in the process of iteration is modified 10 | // and iteration continues. 11 | 12 | UnsafeIterator(Collection c, Iterator i) { 13 | 14 | event create after(Collection c) 15 | returning(Iterator i) : 16 | call(Iterator Collection+.iterator()) && target(c) {} 17 | event updatesource after(Collection c) : 18 | (call(* Collection+.remove*(..)) 19 | || call(* Collection+.add*(..)) ) && target(c) {} 20 | event next before(Iterator i) : 21 | call(* Iterator.next()) && target(i) {} 22 | 23 | ere : create next* updatesource updatesource* next 24 | 25 | @match { 26 | System.out.println("improper iterator usage"); 27 | } 28 | 29 | ere : create 30 | 31 | @match { 32 | System.out.println("collection created"); 33 | } 34 | } 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/test/resources/multi-property/UnsafeIterator.rvm.expected: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | UnsafeIterator(Collection c, Iterator i) { 6 | event create(Collection c, Iterator i){ 7 | } 8 | event updatesource(Collection c){ 9 | } 10 | event next(Iterator i){ 11 | } 12 | ere: create next* updatesource updatesource* next 13 | 14 | @match 15 | { 16 | System.out.println("improper iterator usage"); 17 | } 18 | ere: create 19 | 20 | @match 21 | { 22 | System.out.println("collection created"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/test/resources/output/Creation.mop.rvm: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | Creation(Object o) { 6 | creation event fun1(Object o){ 7 | } 8 | event fun2(Object o){ 9 | } 10 | event mainend(){ 11 | } 12 | ere: fun1 (fun1 | fun2)* mainend 13 | 14 | @fail 15 | { 16 | System.out.println("fail"); 17 | } 18 | @match 19 | { 20 | System.out.println("match"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/test/resources/output/FileClose.mop.rvm: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | FileClose(FileWriter f) { 6 | 7 | FileWriter saved_fw; 8 | creation event write(FileWriter f){ 9 | saved_fw = f; 10 | } 11 | event close(FileWriter f){ 12 | } 13 | event endProg(){ 14 | System.out.println("Program has ended."); 15 | } 16 | ere: write* close+ endProg 17 | 18 | @fail 19 | { 20 | System.err.println("You should close the file you wrote."); 21 | try { 22 | saved_fw.close(); 23 | } catch (Exception e) { 24 | System.err.println(e.getMessage()); 25 | } 26 | __RESET; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/test/resources/output/HasNext.mop.rvm: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | full-binding HasNext(Iterator i) { 6 | event hasnext(Iterator i){ 7 | } 8 | event next(Iterator i){ 9 | } 10 | fsm: 11 | start [ 12 | next -> unsafe 13 | hasnext -> safe 14 | ] 15 | safe [ 16 | next -> start 17 | hasnext -> safe 18 | ] 19 | unsafe [ 20 | next -> unsafe 21 | hasnext -> safe 22 | ] 23 | 24 | alias match = unsafe 25 | 26 | @match 27 | { 28 | System.out.println("next called without hasNext!"); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/test/resources/output/SafeFile.mop.rvm: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | SafeFile(FileReader f, Thread t) { 6 | event open(Thread t, FileReader f){ 7 | } 8 | event close(FileReader f, Thread t){ 9 | } 10 | event begin(Thread t){ 11 | } 12 | event end(Thread t){ 13 | } 14 | cfg: 15 | S -> A S | epsilon, 16 | A -> A begin A end | A open A close | epsilon 17 | 18 | @fail 19 | { 20 | System.out.println("improper use of files"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/test/resources/output/SafeFileWriter.mop.rvm: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | SafeFileWriter(FileWriter f) { 6 | 7 | static int counter = 0; 8 | 9 | int writes = 0; 10 | event open(FileWriter f){ 11 | this.writes = 0; 12 | } 13 | event write(FileWriter f){ 14 | this.writes++; 15 | } 16 | event close(FileWriter f){ 17 | } 18 | ltl: [](write => (not close S open)) 19 | 20 | @violation 21 | { 22 | System.out.println("write after close"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/test/resources/output/UnsafeMapIterator.mop.rvm: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | full-binding UnsafeMapIterator(Map map, Collection c, Iterator i) { 6 | event createColl(Map map, Collection c){ 7 | } 8 | event createIter(Collection c, Iterator i){ 9 | } 10 | event useIter(Iterator i){ 11 | } 12 | event updateMap(Map map){ 13 | } 14 | ere: createColl updateMap* createIter useIter* updateMap updateMap* useIter 15 | 16 | @match 17 | { 18 | System.out.println("unsafe iterator usage!"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/test/resources/single-property/AdviceParamsWithGenericsBasic.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | AdviceParamsWithGenericsBasic() { 7 | 8 | event basicGeneric before(List foo): 9 | call(* bar(..)) && args(foo) {} 10 | 11 | ere : basicGeneric 12 | 13 | @match { 14 | System.out.println("basic generics test"); 15 | } 16 | 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/test/resources/single-property/AdviceParamsWithGenericsIllegal.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | AdviceParamsWithGenericsIllegal() { 7 | 8 | event basicGeneric before(List foo): 9 | call(* bar(..)) && target(foo) {} 10 | 11 | ere : basicGeneric 12 | 13 | @match { 14 | System.out.println("illegal generics test"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/resources/single-property/AdviceParamsWithGenericsMultipleBasic.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | AdviceParamsWithGenericsMultipleBasic() { 7 | 8 | event basicGeneric before(List foo, List bar): 9 | call(* bar(..)) && args(foo, bar) {} 10 | 11 | ere : basicGeneric 12 | 13 | @match { 14 | System.out.println("basic generics test"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/resources/single-property/AdviceParamsWithGenericsMultipleNested.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | AdviceParamsWithGenericsMultipleNested() { 7 | 8 | event basicGeneric before(List>> foo, List>> bar): 9 | call(* buzz(..)) && args(foo, bar) {} 10 | 11 | ere : basicGeneric 12 | 13 | @match { 14 | System.out.println("basic generics test"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/resources/single-property/AdviceParamsWithGenericsNested.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | AdviceParamsWithGenericsNested() { 7 | 8 | event basicGeneric before(List>> foo): 9 | call(* bar(..)) && args(foo) {} 10 | 11 | ere : basicGeneric 12 | 13 | @match { 14 | System.out.println("basic generics test"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/test/resources/single-property/AdviceParamsWithGenericsWildcard.mop: -------------------------------------------------------------------------------- 1 | package mop; 2 | 3 | import java.io.*; 4 | import java.util.*; 5 | 6 | AdviceParamsWithGenericsWildcard() { 7 | 8 | event basicGeneric before(List> bar): 9 | call(* fun(..)) && target(bar) {} 10 | 11 | ere : basicGeneric 12 | 13 | @match { 14 | System.out.println("illegal generics test"); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /unit-test-design.txt: -------------------------------------------------------------------------------- 1 | ***Should not add new function code to the code base: that'll add more 2 | uncovered code and increase the burden of testing. 3 | 4 | ***add helper code in the test folder if necessary. 5 | 6 | For each eg used in unit-testing we should have: 7 | 8 | 1. mop spec file 9 | 2. trusted ast for the mop spec file 10 | 3. trusted .aj output string and .rvm output string 11 | 12 | == 13 | Implement function to test: 14 | 1) whether the untrusted implementation of parse function 15 | can derive the same ast as the trusted one from a mop spec. 16 | 17 | core: compare whether two ast are the same. 18 | two steps~ 19 | i) check shape (same structure) 20 | *too time consuming if we fully explored the ast. 21 | *may perform a bounded depths checking 22 | *increment the depth of exploration in the future 23 | 24 | ii) compare the equality of dumped strings 25 | 26 | 27 | 2) whether the same output will be generated from the same ast 28 | for the system under test: 29 | input: the trusted ast 30 | read the ast, then generate actual .aj and .rvm 31 | 32 | compare with the expected ones: equality of strings. 33 | 34 | --------------------------------------------------------------------------------