class AdLint::Exam::CBuiltin::W0578
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 13404 def initialize(phase_ctxt) super interp = phase_ctxt[:cc1_interpreter] interp.on_implicit_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(init_or_expr, src_var, dst_var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13417 def check(init_or_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(init_or_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 13433 def clear_rvalues(*) @rvalues = {} end
handle_additive(expr, *, rslt_var)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 13449 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 13453 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 13443 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 13437 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 13459 def memorize_rvalue_derivation(rvalue_holder, expr) @rvalues[rvalue_holder] = expr if @rvalues end