class AdLint::Exam::CBuiltin::W1073

Public Class Methods

new(phase_ctxt) click to toggle source
Calls superclass method AdLint::Examination::new
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 21705
def initialize(phase_ctxt)
  super
  interp = phase_ctxt[:cc1_interpreter]
  interp.on_function_started          += T(:enter_function)
  interp.on_function_ended            += T(:leave_function)
  interp.on_function_call_expr_evaled += T(:add_return_value)
  interp.on_variable_value_referred   += T(:refer_return_value)
  @cur_fun   = nil
  @ret_vals = nil
end

Private Instance Methods

add_return_value(expr, fun, *, rslt_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 21735
def add_return_value(expr, fun, *, rslt_var)
  if @cur_fun
    unless fun.type.return_type.void?
      @ret_vals[rslt_var] = [false, expr, fun]
    end
  end
end
enter_function(fun_def, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 21717
def enter_function(fun_def, *)
  @cur_fun   = fun_def
  @ret_vals = {}
end
leave_function(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 21722
def leave_function(*)
  if @cur_fun
    @ret_vals.each_value do |rec|
      unless rec[0]
        fun_name = rec[2].named? ? rec[2].name : "(anon)"
        W(rec[1].location, fun_name)
      end
    end
  end
  @cur_fun = nil
  @ret_vals = nil
end
refer_return_value(expr, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 21743
def refer_return_value(expr, var)
  if @cur_fun
    if rec = @ret_vals[var]
      rec[0] = true
    end
  end
end