class AdLint::Exam::CBuiltin::W0102
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 2328 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_assignment) @params = nil @ptr_relationship = nil end
Private Instance Methods
add_parameter(*, var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2351 def add_parameter(*, var) if @params && var.named? @params.add(var.name) end end
check_assignment(expr, lhs_var, rhs_var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2363 def check_assignment(expr, lhs_var, rhs_var) return unless @params && @ptr_relationship return unless lhs_var.type.pointer? && rhs_var.type.pointer? if ptr = @ptr_relationship[lhs_var] return unless ptr.named? && @params.include?(ptr.name) else return end if rhs_pointee = pointee_of(rhs_var) if rhs_pointee.variable? && rhs_pointee.named? return unless rhs_pointee.binding.memory.dynamic? # NOTE: An array typed parameter can be considered as an alias of the # corresponding argument. So, it is safe to return an address # of the argument. return if rhs_pointee.type.parameter? && rhs_pointee.type.array? W(expr.location) end end end
end_function(*)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2346 def end_function(*) @params = nil @ptr_relationship = nil end
interpreter()
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2385 def interpreter @interp end
relate_pointer(*, var, derefed_var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2357 def relate_pointer(*, var, derefed_var) if @ptr_relationship @ptr_relationship[derefed_var] = var end end
start_function(*)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2341 def start_function(*) @params = Set.new @ptr_relationship = {} end