class AdLint::Exam::CBuiltin::W0579

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 13471
def initialize(phase_ctxt)
  super
  interp = phase_ctxt[:cc1_interpreter]
  interp.on_explicit_conv_performed      += T(:check)
  interp.on_function_started             += T(:clear_rvalues)
  interp.on_unary_arithmetic_expr_evaled += T(:handle_unary)
  interp.on_shift_expr_evaled            += T(:handle_shift)
  interp.on_additive_expr_evaled         += T(:handle_additive)
  interp.on_multiplicative_expr_evaled   += T(:handle_multiplicative)
  @rvalues = nil
end

Private Instance Methods

check(cast_expr, src_var, dst_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13484
def check(cast_expr, src_var, dst_var)
  return unless @rvalues

  src_type = src_var.type
  dst_type = dst_var.type
  return unless src_type.integer?

  if src_type.integer_conversion_rank < dst_type.integer_conversion_rank
    case @rvalues[src_var]
    when Cc1::UnaryArithmeticExpression, Cc1::ShiftExpression,
         Cc1::AdditiveExpression, Cc1::MultiplicativeExpression
      W(cast_expr.location, src_type.brief_image, dst_type.brief_image)
    end
  end
end
clear_rvalues(*) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13500
def clear_rvalues(*)
  @rvalues = {}
end
handle_additive(expr, *, rslt_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13516
def handle_additive(expr, *, rslt_var)
  memorize_rvalue_derivation(rslt_var, expr)
end
handle_multiplicative(expr, *, rslt_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13520
def handle_multiplicative(expr, *, rslt_var)
  unless expr.operator.type == "%"
    memorize_rvalue_derivation(rslt_var, expr)
  end
end
handle_shift(expr, *, rslt_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13510
def handle_shift(expr, *, rslt_var)
  if expr.operator.type == "<<"
    memorize_rvalue_derivation(rslt_var, expr)
  end
end
handle_unary(expr, *, rslt_var) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13504
def handle_unary(expr, *, rslt_var)
  if expr.operator == "~"
    memorize_rvalue_derivation(rslt_var, expr)
  end
end
memorize_rvalue_derivation(rvalue_holder, expr) click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13526
def memorize_rvalue_derivation(rvalue_holder, expr)
  @rvalues[rvalue_holder] = expr if @rvalues
end