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