class AdLint::Exam::CBuiltin::W0599

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 13989
def initialize(phase_ctxt)
  super
  interp = phase_ctxt[:cc1_interpreter]
  interp.on_sequence_point_reached  += T(:commit_changes)
  interp.on_variable_value_referred += T(:refer_variable)
  interp.on_variable_value_updated  += T(:update_variable)
  @refer_cnt  = Hash.new(0)
  @update_cnt = Hash.new(0)
end

Private Instance Methods

commit_changes(seqp) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14000
def commit_changes(seqp)
  (@refer_cnt.keys & @update_cnt.keys).each do |var|
    if @refer_cnt[var] > 0 && @update_cnt[var] > 0
      W(seqp.location, var.name)
    end
  end
  @refer_cnt  = Hash.new(0)
  @update_cnt = Hash.new(0)
end
refer_variable(*, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14010
def refer_variable(*, var)
  @refer_cnt[var] += 1 if var.named?
end
update_variable(expr, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14014
def update_variable(expr, var)
  if var.named?
    case expr
    when Cc1::SimpleAssignmentExpression, Cc1::CompoundAssignmentExpression
      # NOTE: The expression-statement `i = i + j;' should not be warned.
      #       But the expression-statement `i = i++ + j;' should be warned.
      #       So, side-effects of the assignment-expression are given
      #       special treatment.
    else
      @update_cnt[var] += 1
    end
  end
end