class AdLint::Exam::CBuiltin::W0611

Constants

IterationStmt

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 14359
def initialize(phase_ctxt)
  super
  @interp = phase_ctxt[:cc1_interpreter]
  @interp.on_while_stmt_started      += T(:enter_while_stmt)
  @interp.on_do_stmt_started         += T(:enter_do_stmt)
  @interp.on_for_stmt_started        += T(:enter_for_stmt)
  @interp.on_c99_for_stmt_started    += T(:enter_c99_for_stmt)
  @interp.on_while_ctrlexpr_evaled   += T(:memorize_ctrlexpr_val)
  @interp.on_do_ctrlexpr_evaled      += T(:memorize_ctrlexpr_val)
  @interp.on_for_ctrlexpr_evaled     += T(:memorize_ctrlexpr_val)
  @interp.on_c99_for_ctrlexpr_evaled += T(:memorize_ctrlexpr_val)
  @interp.on_variable_value_updated  += T(:update_ctrl_var)
  @interp.on_while_stmt_ended        += T(:check)
  @interp.on_do_stmt_ended           += T(:check)
  @interp.on_for_stmt_ended          += T(:check)
  @interp.on_c99_for_stmt_ended      += T(:check)
  @iter_stmts = []
end

Private Instance Methods

check(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14429
def check(*)
  if ctrlexpr = @iter_stmts.last.ctrlexpr
    unless constant_expression?(ctrlexpr)
      ctrlexpr_val = @iter_stmts.last.ctrlexpr_val
      ctrl_vars = @iter_stmts.last.ctrl_vars
      if ctrlexpr_val && ctrlexpr_val.test_must_be_true.true? and
          ctrl_vars && ctrl_vars.values.none?
        W(ctrlexpr.location)
      end
    end
  end
  @iter_stmts.pop
end
deduct_ctrl_vars(ctrlexpr) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14407
def deduct_ctrl_vars(ctrlexpr)
  collect_object_specifiers(ctrlexpr).each_with_object({}) do |os, hash|
    if ctrl_var = variable_named(os.identifier.value)
      hash[os.identifier.value] = false unless ctrl_var.type.const?
    end
  end
end
enter_c99_for_stmt(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14391
def enter_c99_for_stmt(node)
  enter_iteration_stmt(node.condition_statement.expression)
end
enter_do_stmt(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14383
def enter_do_stmt(node)
  enter_iteration_stmt(node.expression)
end
enter_for_stmt(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14387
def enter_for_stmt(node)
  enter_iteration_stmt(node.condition_statement.expression)
end
enter_iteration_stmt(ctrlexpr) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14398
def enter_iteration_stmt(ctrlexpr)
  if ctrlexpr
    @iter_stmts.push(IterationStmt.new(ctrlexpr, nil,
                                       deduct_ctrl_vars(ctrlexpr)))
  else
    @iter_stmts.push(IterationStmt.new(nil, nil, nil))
  end
end
enter_while_stmt(node) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14379
def enter_while_stmt(node)
  enter_iteration_stmt(node.expression)
end
interpreter() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14443
def interpreter
  @interp
end
memorize_ctrlexpr_val(*, ctrlexpr_val) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14415
def memorize_ctrlexpr_val(*, ctrlexpr_val)
  @iter_stmts.last.ctrlexpr_val = ctrlexpr_val
end
update_ctrl_var(expr, var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 14419
def update_ctrl_var(expr, var)
  if var.named?
    @iter_stmts.reverse_each do |iter_stmt|
      if iter_stmt.ctrlexpr && iter_stmt.ctrl_vars.include?(var.name)
        iter_stmt.ctrl_vars[var.name] = true
      end
    end
  end
end