class AdLint::Exam::CBuiltin::W1039
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 20771 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(expr, fun, arg_vars, *)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 20779 def check(expr, fun, arg_vars, *) if fun.named? case fun.name when /\A.*printf\z/ check_printf_format(expr, arg_vars) when /\A.*scanf\z/ check_scanf_format(expr, arg_vars) end end end
check_printf_format(expr, arg_vars)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 20790 def check_printf_format(expr, arg_vars) if fmt = create_printf_format(expr, arg_vars) fmt.conversion_specifiers.each_with_index do |conv_spec, idx| W(fmt.location, idx + 1) if conv_spec.length_modifier == "ll" end end end
check_scanf_format(expr, arg_vars)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 20798 def check_scanf_format(expr, arg_vars) if fmt = create_scanf_format(expr, arg_vars) fmt.conversion_specifiers.each_with_index do |conv_spec, idx| W(fmt.location, idx + 1) if conv_spec.length_modifier == "ll" end end end
create_printf_format(expr, arg_vars)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 20806 def create_printf_format(expr, arg_vars) if fmt_idx = format_arg_index_of(expr) fmt_arg = expr.argument_expressions[fmt_idx] if fmt_arg && fmt_arg.literal.value =~ /\AL?"(.*)"\z/i loc = fmt_arg.location args = arg_vars.drop(fmt_idx + 1) || [] return Cc1::PrintfFormat.new($1, loc, args, @environ) end end nil end
create_scanf_format(expr, arg_vars)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 20818 def create_scanf_format(expr, arg_vars) if fmt_idx = format_arg_index_of(expr) fmt_arg = expr.argument_expressions[fmt_idx] if fmt_arg && fmt_arg.literal.value =~ /\AL?"(.*)"\z/i loc = fmt_arg.location args = arg_vars.drop(fmt_idx + 1) || [] return Cc1::ScanfFormat.new($1, loc, args, @environ) end end nil end
format_arg_index_of(funcall_expr)
click to toggle source
# File lib/adlint/exam/c_builtin/cc1_check.rb, line 20830 def format_arg_index_of(funcall_expr) funcall_expr.argument_expressions.index do |arg_expr| arg_expr.kind_of?(Cc1::StringLiteralSpecifier) end end