metasploit-framework/lib/metasm/misc/lint.rb

59 lines
1.3 KiB
Ruby

#!/usr/bin/ruby
# This file is part of Metasm, the Ruby assembly manipulation suite
# Copyright (C) 2006-2009 Yoann GUILLOT
#
# Licence is LGPL, see LICENCE in the top-level directory
# this is a ruby code cleaner tool
# it passes its argument to ruby -v -c, which displays warnings (eg unused variable)
# it shows the incriminated line along the warning, to help identify false positives
# probably linux-only, and need ruby-1.9.1 or newer
def lint(tg)
if File.symlink?(tg)
# nothing
elsif File.directory?(tg)
Dir.entries(tg).each { |ent|
next if ent == '.' or ent == '..'
ent = File.join(tg, ent)
lint(ent) if File.directory?(ent) or ent =~ /\.rb$/
}
else
lint_file(tg)
end
end
def lint_file(tg)
flines = nil
compile_warn(tg).each_line { |line|
file, lineno, warn = line.split(/\s*:\s*/, 3)
if file == tg
if not flines
puts "#{tg}:"
flines = File.readlines(file) #File.open(file, 'rb') { |fd| fd.readlines }
end
puts " l.#{lineno}: #{warn.strip}: #{flines[lineno.to_i-1].strip.inspect}"
end
}
puts if flines
end
def compile_warn(tg)
r, w = IO.pipe('binary')
if !fork
r.close
$stderr.reopen w
$stdout.reopen '/dev/null'
exec 'ruby', '-v', '-c', tg
exit!
else
w.close
end
r
end
ARGV << '.' if ARGV.empty?
ARGV.each { |arg| lint arg }