Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.63 KB | None | 0 0
  1. package gov.nasa.jpf.listener;
  2. import gov.nasa.jpf.Config;
  3. import gov.nasa.jpf.JPF;
  4. import gov.nasa.jpf.ListenerAdapter;
  5. import gov.nasa.jpf.PropertyListenerAdapter;
  6. import gov.nasa.jpf.vm.ElementInfo;
  7. import gov.nasa.jpf.vm.VM;
  8. import gov.nasa.jpf.vm.MethodInfo;
  9. import gov.nasa.jpf.vm.ThreadInfo;
  10. import gov.nasa.jpf.vm.bytecode.FieldInstruction;
  11. import gov.nasa.jpf.vm.Instruction;
  12. import gov.nasa.jpf.report.ConsolePublisher;
  13. import gov.nasa.jpf.report.Publisher;
  14. import java.io.PrintWriter;
  15. import java.util.Collections;
  16. import gov.nasa.jpf.util.VarSpec;
  17. import gov.nasa.jpf.util.FieldSpec;
  18. import java.util.Set;
  19. import gov.nasa.jpf.vm.FieldInfo;
  20. import gov.nasa.jpf.jvm.bytecode.ASTORE;
  21. import gov.nasa.jpf.search.Search;
  22. import gov.nasa.jpf.vm.StackFrame;
  23. import java.io.StringWriter;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. public class NonNullChecker extends PropertyListenerAdapter {
  27. // TO-DO: incluir declaraci ́on de dos arrays (o estructura de
  28. // datos similar):
  29. // * cuyos elementos sean FieldSpec, para almacenar los
  30. // campos de inter ́es (recogido del .jpf)
  31. // * cuyos elementos sean VarSpec, para almacenar las
  32. // variables de inter ́es (recogidas del .jpf)
  33. private FieldSpec[] fspec;
  34. private VarSpec[] vspec;
  35. // TO-DO: incluir declaraci ́on del array (o estructura de datos
  36. // similar) para los errores
  37. private List<String> errors;
  38.  
  39. public NonNullChecker (Config conf, JPF jpf){
  40. extractFields(conf);
  41. extractVars(conf);
  42. errors = new ArrayList<>();
  43. jpf.addPublisherExtension(ConsolePublisher.class, this);
  44. }
  45. int num_error = 0;
  46. VM vm;
  47.  
  48. private void extractFields(Config conf) {
  49. Set<String> spec = conf.getStringSet("nonnull.fields");
  50. if (spec == null)
  51. spec = Collections.emptySet();
  52. fspec = new FieldSpec[spec.size()];
  53. int i = -1;
  54. for (String field : spec)
  55. fspec[++i] = FieldSpec.createFieldSpec(field);
  56. }
  57.  
  58. private void extractVars(Config conf) {
  59. Set<String> spec = conf.getStringSet("nonnull.vars");
  60. if (spec == null)
  61. spec = Collections.emptySet();
  62. vspec = new VarSpec[spec.size()];
  63. int i = -1;
  64. for (String var : spec)
  65. vspec[++i] = VarSpec.createVarSpec(var);
  66. }
  67.  
  68. private void checkFieldInsn(FieldInstruction insn, ThreadInfo ti, VM vm) {
  69. if (isRelevantField(insn)) {
  70. if (isNullFieldStore(insn,ti)) {
  71. // TO-DO: c ́odigo para almacenar en el array de errores un
  72. // String con el error detectado
  73. errors.add("Error en el campo " + insn.getFieldName() +
  74. " en linea " + insn.getLineNumber() );
  75. num_error++;
  76. vm.backtrack();
  77. }
  78. }
  79. }
  80.  
  81. private boolean isRelevantField(FieldInstruction insn) {
  82. if (!insn.isReferenceField())
  83. return false;
  84. FieldInfo fi = insn.getFieldInfo();
  85. for (FieldSpec fs : fspec) {
  86. if (fs.matches(fi))
  87. return true;
  88. }
  89. return false;
  90. }
  91.  
  92. private boolean isNullFieldStore(FieldInstruction insn, ThreadInfo ti) {
  93. FieldInfo fi = insn.getFieldInfo();
  94. ElementInfo ei = insn.getElementInfo(ti);
  95. return ei.getFieldValueObject(fi.getName()) == null;
  96. }
  97.  
  98. @Override
  99. public void executeInstruction (VM vm, ThreadInfo ti, Instruction insn){
  100. // TO-DO:
  101. // Si se trata de una instrucci´on FieldInstruction
  102. // entonces llama al m´etodo de comprobaci´on para campos
  103. // Sugerencia: usar (instanceof) para comprobar si insn
  104. // es de la clase requerida
  105. if (insn instanceof FieldInstruction){
  106. checkFieldInsn((FieldInstruction) insn, ti, vm);
  107. }
  108. if(insn instanceof ASTORE){
  109. checkLocalVarInsn((ASTORE) insn, ti, vm);
  110. }
  111. }
  112.  
  113. private boolean isRelevantVar(ASTORE insn) {
  114. int slotIdx = insn.getLocalVariableIndex();
  115. MethodInfo mi = insn.getMethodInfo();
  116. int pc = insn.getPosition() + 1;
  117. for (VarSpec varSpec : vspec) {
  118. if (varSpec.getMatchingLocalVarInfo(mi, pc, slotIdx) != null)
  119. return true;
  120. }
  121. return false;
  122. }
  123. private boolean isNullVarStore(ASTORE insn, ThreadInfo ti) {
  124. String vn = insn.getLocalVariableName();
  125. StackFrame frame = ti.getTopFrame();
  126. return (!(frame.getLocalOrFieldValue(vn) == null));
  127. }
  128.  
  129. private void checkLocalVarInsn(ASTORE insn, ThreadInfo ti, VM vm) {
  130. // TO-DO: completar c´odigo
  131. if(isRelevantVar(insn)){
  132. if(isNullVarStore(insn, ti)){
  133. errors.add("Error en la variable " + insn.getLocalVariableName() +
  134. " en linea " + insn.getLineNumber() );
  135. num_error++;
  136. vm.backtrack();
  137. }
  138. }
  139. }
  140.  
  141. @Override
  142. public boolean check(Search search, VM vm) {
  143. return errors.isEmpty();
  144. }
  145.  
  146. @Override
  147. public void reset() {
  148. errors = new ArrayList<>();
  149. }
  150.  
  151.  
  152. @Override
  153. public String getErrorMessage() {
  154. if (!errors.isEmpty()){
  155. StringWriter sw = new StringWriter();
  156. PrintWriter pw = new PrintWriter(sw);
  157. errors.forEach(it -> pw.println(it));
  158. pw.flush();
  159. return sw.toString();
  160.  
  161. } else {
  162. return null;
  163. }
  164. }
  165.  
  166.  
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement