class AdLint::Exam::CBuiltin::W0585
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 13820 def initialize(phase_ctxt) super @interp = phase_ctxt[:cc1_interpreter] @interp.on_for_stmt_started += T(:check_for_stmt) @interp.on_c99_for_stmt_started += T(:check_c99_for_stmt) end
Private Instance Methods
check_c99_for_stmt(node)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13843 def check_c99_for_stmt(node) inited_var_names = collect_identifier_declarators(node.declaration).map { |id| id.identifier.value } if ctrl_var_name = deduct_ctrl_variable_name(node, inited_var_names) if node.expression varying_var_names = collect_varying_variable_names(node.expression) unless varying_var_names.include?(ctrl_var_name) W(node.expression.location, ctrl_var_name) end end end end
check_for_stmt(node)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13828 def check_for_stmt(node) inited_var_names = collect_object_specifiers(node.initial_statement).map { |os| os.identifier.value } if ctrl_var_name = deduct_ctrl_variable_name(node, inited_var_names) if node.expression varying_var_names = collect_varying_variable_names(node.expression) unless varying_var_names.include?(ctrl_var_name) W(node.expression.location, ctrl_var_name) end end end end
collect_varying_variable_names(node)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13872 def collect_varying_variable_names(node) varying_var_names = [] collect_simple_assignment_expressions(node).each do |expr| if expr.lhs_operand.kind_of?(Cc1::ObjectSpecifier) varying_var_names.push(expr.lhs_operand.identifier.value) end end collect_compound_assignment_expressions(node).each do |expr| if expr.lhs_operand.kind_of?(Cc1::ObjectSpecifier) varying_var_names.push(expr.lhs_operand.identifier.value) end end collect_prefix_increment_expressions(node).each do |expr| if expr.operand.kind_of?(Cc1::ObjectSpecifier) varying_var_names.push(expr.operand.identifier.value) end end collect_prefix_decrement_expressions(node).each do |expr| if expr.operand.kind_of?(Cc1::ObjectSpecifier) varying_var_names.push(expr.operand.identifier.value) end end collect_postfix_increment_expressions(node).each do |expr| if expr.operand.kind_of?(Cc1::ObjectSpecifier) varying_var_names.push(expr.operand.identifier.value) end end collect_postfix_decrement_expressions(node).each do |expr| if expr.operand.kind_of?(Cc1::ObjectSpecifier) varying_var_names.push(expr.operand.identifier.value) end end varying_var_names.uniq end
deduct_ctrl_variable_name(node, inited_var_names)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13858 def deduct_ctrl_variable_name(node, inited_var_names) var_names = inited_var_names + node.varying_variable_names histo = var_names.each_with_object({}) { |name, hash| hash[name] = 0 } ctrlexpr, * = node.deduct_controlling_expression collect_object_specifiers(ctrlexpr).map { |obj_spec| obj_spec.identifier.value }.each { |obj_name| histo.include?(obj_name) and histo[obj_name] += 1 } histo.to_a.sort { |a, b| b.last <=> a.last }.map(&:first).find do |name| var = variable_named(name) and !var.type.const? end end
interpreter()
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13914 def interpreter @interp end