class AdLint::Exam::CBuiltin::W0580
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 13540 def initialize(phase_ctxt) super @interp = phase_ctxt[:cc1_interpreter] @interp.on_function_started += T(:start_function) @interp.on_function_ended += T(:end_function) @interp.on_parameter_defined += T(:add_parameter) @interp.on_indirection_expr_evaled += T(:relate_pointer) @interp.on_assignment_expr_evaled += T(:check) @params = nil @ptr_relat = nil end
Private Instance Methods
add_parameter(*, var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13563 def add_parameter(*, var) if @params && var.named? @params.add(var.name) end end
check(assign_expr, lhs_var, rhs_var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13575 def check(assign_expr, lhs_var, rhs_var) return unless @params && @ptr_relat return unless lhs_var.type.pointer? && rhs_var.type.pointer? if rhs_pointee = pointee_of(rhs_var) and rhs_pointee.variable? && rhs_pointee.named? && rhs_pointee.scope.local? && rhs_pointee.binding.memory.static? if lhs_var.scope.global? W(assign_expr.location) else if ptr = @ptr_relat[lhs_var] if ptr.named? && @params.include?(ptr.name) W(assign_expr.location) end end end end end
end_function(*)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13558 def end_function(*) @params = nil @ptr_relat = nil end
interpreter()
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13594 def interpreter @interp end
relate_pointer(*, var, derefed_var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13569 def relate_pointer(*, var, derefed_var) if @ptr_relat @ptr_relat[derefed_var] = var end end
start_function(*)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13553 def start_function(*) @params = Set.new @ptr_relat = {} end