class AdLint::Exam::CBuiltin::W0674
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 15761 def initialize(phase_ctxt) super interp = phase_ctxt[:cc1_interpreter] interp.on_function_call_expr_evaled += T(:check) @environ = interp.environment end
Private Instance Methods
check(funcall_expr, fun, arg_vars, *)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 15769 def check(funcall_expr, fun, arg_vars, *) if fun.named? && fun.name =~ /\A.*scanf\z/ fmt = create_format(funcall_expr, format_str_index_of(funcall_expr), arg_vars, @environ) return unless fmt fmt.conversion_specifiers.each_with_index do |cs, idx| unless cs.valid_length_modifier? warn(fmt, cs.conversion_specifier_character, idx) end end end end
create_format(funcall_expr, fmt_str_idx, arg_vars, env)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 15795 def create_format(funcall_expr, fmt_str_idx, arg_vars, env) if fmt_str_idx fmt_str = funcall_expr.argument_expressions[fmt_str_idx] if fmt_str && fmt_str.literal.value =~ /\AL?"(.*)"\z/i args = arg_vars.drop(fmt_str_idx + 1) || [] return Cc1::ScanfFormat.new($1, fmt_str.location, args, env) end end nil end
format_str_index_of(funcall_expr)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 15789 def format_str_index_of(funcall_expr) funcall_expr.argument_expressions.index do |arg_expr| arg_expr.kind_of?(Cc1::StringLiteralSpecifier) end end
target_conversion_specifiers()
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 15806 def target_conversion_specifiers ["d", "i", "n"] end
warn(fmt, cs_char, idx)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 15783 def warn(fmt, cs_char, idx) if target_conversion_specifiers.include?(cs_char) W(fmt.location, idx + 1) end end