class AdLint::Exam::CBuiltin::FN_UNUV

Public Class Methods

new(phase_ctxt) click to toggle source
Calls superclass method AdLint::Examination::new
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 284
def initialize(phase_ctxt)
  super
  @fpath = phase_ctxt[:sources].first.fpath
  interp = phase_ctxt[:cc1_interpreter]
  interp.on_function_started        += T(:enter_function)
  interp.on_function_ended          += T(:leave_function)
  interp.on_variable_defined        += T(:define_variable)
  interp.on_parameter_defined       += T(:define_variable)
  interp.on_variable_referred       += T(:refer_variable)
  interp.on_variable_value_referred += T(:read_variable)
  interp.on_variable_value_updated  += T(:write_variable)
  @cur_fun = nil
  @vars = nil
end

Private Instance Methods

define_variable(*, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 322
def define_variable(*, var)
  if @cur_fun
    @vars[var.name] = 0
  end
end
do_execute(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 301
def do_execute(*) end
do_prepare(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 300
def do_prepare(*) end
enter_function(fun_def, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 303
def enter_function(fun_def, *)
  @cur_fun = fun_def
  @vars = {}
end
leave_function(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 308
def leave_function(*)
  if @cur_fun
    useless_cnt = @vars.each_value.reduce(0) { |cnt, read_cnt|
      read_cnt == 0 ? cnt + 1 : cnt
    }

    FN_UNUV(FunctionId.new(@cur_fun.identifier.value,
                           @cur_fun.signature.to_s),
            @cur_fun.location, useless_cnt)
    @cur_fun = nil
    @vars = nil
  end
end
read_variable(*, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 334
def read_variable(*, var)
  if @cur_fun
    @vars[var.name] += 1 if var.named? && @vars[var.name]
  end
end
refer_variable(*, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 328
def refer_variable(*, var)
  if @cur_fun
    @vars[var.name] += 1 if var.named? && @vars[var.name]
  end
end
write_variable(*, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_metric.rb, line 340
def write_variable(*, var)
  if @cur_fun
    @vars[var.name] = 0 if var.named? && @vars[var.name]
  end
end