docs: @Override
      public UnconditionalValueDerefDataflow analyze(IAnalysisCache analysisCache, MethodDescriptor descriptor)
              throws CheckedAnalysisException {
          MethodGen methodGen = getMethodGen(analysisCache, descriptor);
          if (methodGen == null) {
              throw new MethodUnprofitableException(descriptor);
          }
  
          CFG cfg = getCFG(analysisCache, descriptor);
  
          ValueNumberDataflow vnd = getValueNumberDataflow(analysisCache, descriptor);
  
          UnconditionalValueDerefAnalysis analysis = new UnconditionalValueDerefAnalysis(getReverseDepthFirstSearch(analysisCache,
                  descriptor), getDepthFirstSearch(analysisCache, descriptor), cfg, getMethod(analysisCache, descriptor),
                  methodGen, vnd, getAssertionMethods(analysisCache, descriptor.getClassDescriptor()));
  
          IsNullValueDataflow inv = getIsNullValueDataflow(analysisCache, descriptor);
          // XXX: hack to clear derefs on not-null branches
          analysis.clearDerefsOnNonNullBranches(inv);
  
          TypeDataflow typeDataflow = getTypeDataflow(analysisCache, descriptor);
          // XXX: type analysis is needed to resolve method calls for
          // checking whether call targets unconditionally dereference parameters
          analysis.setTypeDataflow(typeDataflow);
  
          UnconditionalValueDerefDataflow dataflow = new UnconditionalValueDerefDataflow(cfg, analysis);
          dataflow.execute();
          if (ClassContext.DUMP_DATAFLOW_ANALYSIS) {
              dataflow.dumpDataflow(analysis);
          }
          if (UnconditionalValueDerefAnalysis.DEBUG) {
              ClassContext.dumpDataflowInformation(getMethod(analysisCache, descriptor), cfg, vnd, inv, dataflow, typeDataflow);
          }
  
          return dataflow;
      }