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