class AdLint::Exam::CBuiltin::W0101

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

Private Instance Methods

check(expr, lhs_var, rhs_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2293
def check(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?

      case
      when lhs_var.binding.memory.static?
        W(expr.location)
      when lhs_var.scope.depth < rhs_pointee.scope.depth
        W(expr.location)
      end
    end
  end
end
interpreter() click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 2314
def interpreter
  @interp
end