class AdLint::Exam::CBuiltin::W0107

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 2577
def initialize(phase_ctxt)
  super
  @interp = phase_ctxt[:cc1_interpreter]
  @interp.on_assignment_expr_evaled += T(:check_assignment)
end

Private Instance Methods

check_assignment(expr, lhs_var, rhs_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2584
def check_assignment(expr, lhs_var, rhs_var)
  return unless lhs_var.type.pointer? && rhs_var.type.pointer?

  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?

      if lhs_var.scope.local? && lhs_var.binding.memory.static?
        W(expr.location)
      end
    end
  end
end
interpreter() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2602
def interpreter
  @interp
end