@Override
  public BasicValue unaryOperation(AbstractInsnNode insn, BasicValue value) throws AnalyzerException {
    int origin = insnIndex(insn);
    switch (insn.getOpcode()) {
      case GETFIELD, ARRAYLENGTH, MONITORENTER -> {
        if (value instanceof NthParamValue) {
          dereferencedParams[((NthParamValue)value).n] = true;
        }
        if (value instanceof Trackable) {
          dereferencedValues[((Trackable)value).getOriginInsnIndex()] = true;
        }
        return track(origin, super.unaryOperation(insn, value));
      }
      case PUTSTATIC -> {
        if (!staticFields.isEmpty()) {
          FieldInsnNode node = (FieldInsnNode)insn;
          Member field = new Member(node.owner, node.name, node.desc);
          staticFields.computeIfPresent(field, (f, v) -> value);
        }
      }
      case CHECKCAST -> {
        if (value instanceof NthParamValue) {
          return new NthParamValue(Type.getObjectType(((TypeInsnNode)insn).desc), ((NthParamValue)value).n);
        }
      }
      case NEWARRAY, ANEWARRAY -> {
        return new NotNullValue(super.unaryOperation(insn, value).getType());
      }
      default -> {
      }
    }
    return track(origin, super.unaryOperation(insn, value));
  }
@Override
  public BasicValue unaryOperation(AbstractInsnNode insn, BasicValue value)