class AdLint::Exam::CBuiltin::W0609

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 14242
def initialize(phase_ctxt)
  super
  interp = phase_ctxt[:cc1_interpreter]
  interp.on_relational_expr_evaled  += T(:check)
  interp.on_equality_expr_evaled    += T(:check)
  interp.on_logical_and_expr_evaled += T(:check)
  interp.on_logical_or_expr_evaled  += T(:check)
  interp.on_for_stmt_started        += T(:enter_for_statement)
  interp.on_c99_for_stmt_started    += T(:enter_for_statement)
  interp.on_for_stmt_ended          += T(:leave_for_statement)
  interp.on_c99_for_stmt_ended      += T(:leave_for_statement)
  interp.on_for_ctrlexpr_evaled     += T(:memorize_for_ctrlexpr)
  interp.on_c99_for_ctrlexpr_evaled += T(:memorize_for_ctrlexpr)
  @for_ctrlexpr_stack = []
end

Private Instance Methods

check(expr, *, rslt_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14259
def check(expr, *, rslt_var)
  if rslt_var.value.test_must_be_true.true? && !should_not_check?(expr)
    W(expr.location)
  end
end
enter_for_statement(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14265
def enter_for_statement(*)
  @for_ctrlexpr_stack.push(nil)
end
leave_for_statement(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14269
def leave_for_statement(*)
  @for_ctrlexpr_stack.pop
end
memorize_for_ctrlexpr(for_stmt, *) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14273
def memorize_for_ctrlexpr(for_stmt, *)
  if explicit_ctrlexpr = for_stmt.condition_statement.expression
    @for_ctrlexpr_stack[-1] = explicit_ctrlexpr
  end
end
should_not_check?(expr) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14279
def should_not_check?(expr)
  if ctrlexpr = @for_ctrlexpr_stack.last
    collect_relational_expressions(ctrlexpr).include?(expr)  ||
    collect_equality_expressions(ctrlexpr).include?(expr)    ||
    collect_logical_and_expressions(ctrlexpr).include?(expr) ||
    collect_logical_or_expressions(ctrlexpr).include?(expr)
  else
    false
  end
end