nasl-pedant 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ Pedant, a static analysis tool for NASL
2
+ =======================================
3
+
4
+ Installing
5
+ ----------
6
+ If you have Ruby 1.9.3+ and Rubygems installed, you can simply do:
7
+ `gem install nasl-pedant`
8
+
9
+ Using
10
+ -----
11
+ To check a script, run this: `pedant check scriptname.nasl`.
12
+ You can check `.inc` files the same way.
13
+
14
+ See a `[WARN]` but there's no explanation of the problem? Try adding `-v`.
15
+
16
+ Checking multiple files together is not currently supported (and has some
17
+ semantics questions to be sorted out first). Currently, using xargs is the best
18
+ way to check multiple files. For example, for checking all the plugins in a
19
+ directory:
20
+
21
+ find . -maxdepth 1 -name '*.nasl' | while read fname; do
22
+ echo $fname
23
+ pedant check $fname
24
+ echo
25
+ done > pedant_results_$(date +%s)
26
+
27
+ Bugs
28
+ ----
29
+
30
+ 1. Choosing which checks to run does not currently work (`-c` flag)
31
+ 1. Checking multiple files together does not currently work
32
+ 1. Only works for up to 5.2 code (will not fix, the `nasl`
33
+ interpreter can now export an AST)
34
+ 1. Some of the checks have inconsistent titles in terms of "truthiness"
35
+ 1. No filename is output per-file, which makes checking multiple files difficult
36
+
37
+ Todo
38
+ ----
39
+
40
+ 1. Iron out some of the semantics:
41
+ - What is `test mode` used for?
42
+ - Currently files are all checked independently: what should be done when
43
+ we're given `.inc` and `.nasl` files in one invocation?
44
+ 1. Add a control-flow graph?
45
+ 1. Add some kind of taint tracking?
data/lib/pedant/check.rb CHANGED
@@ -51,10 +51,7 @@ module Pedant
51
51
 
52
52
  # Run all the dependencies for this check if we're in test mode.
53
53
  return unless @kb[:test_mode]
54
- self.class.depends.each do |cls|
55
- chk = cls.new(@kb)
56
- chk.run
57
- end
54
+ Check.run_checks_in_dependency_order(kb, self.class.depends)
58
55
  end
59
56
 
60
57
  def self.list
@@ -91,6 +88,35 @@ module Pedant
91
88
  end
92
89
  end
93
90
 
91
+ def self.run_checks_in_dependency_order(kb, checks)
92
+ # Try to run each pending check, until we've run all our checks or
93
+ # deadlocked.
94
+ fatal = false
95
+ until checks.empty? || fatal
96
+ # Find all of the checks that can run right now.
97
+ ready = checks.select { |cls| cls.ready?(kb) }
98
+ break if ready.empty?
99
+
100
+ # Run all of the checks that are ready.
101
+ ready.each do |cls|
102
+ # Create a new check instance.
103
+ chk = cls.new(kb)
104
+ checks.delete(cls)
105
+
106
+ chk.run
107
+
108
+ # Yield the results of the finished check
109
+ yield chk if block_given?
110
+
111
+ # Fatal errors mean that no further checks should be processed.
112
+ if chk.result == :fatal
113
+ fatal = true
114
+ break
115
+ end
116
+ end
117
+ end
118
+ end
119
+
94
120
  def report(level, text=nil)
95
121
  unless text.nil?
96
122
  if @@levels.index(level).nil?
@@ -30,7 +30,7 @@ module Pedant
30
30
  super + [:file_mode, :base, :main]
31
31
  end
32
32
 
33
- def provides
33
+ def self.provides
34
34
  super + [:codes, :trees]
35
35
  end
36
36
 
@@ -77,7 +77,7 @@ module Pedant
77
77
  usage(e.message)
78
78
  end
79
79
 
80
- options[:checks] << cls
80
+ ([cls] + cls.depends).each { |cls| options[:checks] << cls }
81
81
  end
82
82
 
83
83
  opts.on('-h', '--help', 'Display this help screen.') do
@@ -128,48 +128,27 @@ module Pedant
128
128
  end
129
129
 
130
130
  def self.run_one(opts, path)
131
+ puts Rainbow("CHECKING: #{path}").cyan
131
132
  # Get a list of the checks we're going to be running.
132
133
  if not opts[:checks].empty?
133
134
  pending = opts[:checks].to_a
134
135
  else
135
- pending = Check.all
136
+ pending = Array.new(Check.all)
136
137
  end
137
138
 
138
139
  # Initialize the knowledge base where checks can store information for
139
140
  # other checks.
140
141
  kb = KnowledgeBase.new(:file_mode, path)
141
142
 
142
- # Try to run each pending check, until we've run all our checks or
143
- # deadlocked.
144
- fatal = false
145
- until pending.empty? || fatal
146
- # Find all of the checks that can run right now.
147
- ready = pending.select { |cls| cls.ready?(kb) }
148
- break if ready.empty?
149
-
150
- # Run all of the checks that are ready.
151
- ready.each do |cls|
152
- # Create a new check instance.
153
- chk = cls.new(kb)
154
- pending.delete(cls)
155
-
156
- chk.run
157
-
158
- # Fatal errors mean that no further checks should be processed.
159
- if chk.result == :fatal
160
- fatal = true
161
- break
162
- end
163
-
164
- # Display the results of the check.
165
- puts chk.report(opts[:verbosity])
166
- end
143
+ Check.run_checks_in_dependency_order(kb, pending) do |chk|
144
+ puts chk.report(opts[:verbosity])
167
145
  end
168
146
 
169
147
  # Notify the user if any checks did not run due to unsatisfied
170
148
  # dependencies or a fatal error occurring before they had the chance to
171
149
  # run.
172
150
  pending.each { |cls| puts cls.new(kb).report(opts[:verbosity]) }
151
+ puts
173
152
  end
174
153
  end
175
154
  end
@@ -1,3 +1,3 @@
1
1
  module Pedant
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nasl-pedant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-03-02 00:00:00.000000000 Z
14
+ date: 2015-03-05 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rake
@@ -79,6 +79,7 @@ extra_rdoc_files: []
79
79
  files:
80
80
  - .gitignore
81
81
  - Gemfile
82
+ - README.md
82
83
  - Rakefile
83
84
  - bin/pedant
84
85
  - lib/pedant.rb
@@ -136,18 +137,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
137
  - - ! '>='
137
138
  - !ruby/object:Gem::Version
138
139
  version: '0'
139
- segments:
140
- - 0
141
- hash: 333689523
142
140
  required_rubygems_version: !ruby/object:Gem::Requirement
143
141
  none: false
144
142
  requirements:
145
143
  - - ! '>='
146
144
  - !ruby/object:Gem::Version
147
145
  version: '0'
148
- segments:
149
- - 0
150
- hash: 333689523
151
146
  requirements: []
152
147
  rubyforge_project: nasl-pedant
153
148
  rubygems_version: 1.8.23
@@ -168,3 +163,4 @@ test_files:
168
163
  - test/unit/checks/test_flipped_operands_on_match_or_substring.rb
169
164
  - test/unit/checks/test_plugin_type_not_specified.rb
170
165
  - test/unit/checks/test_script_family_not_specified.rb
166
+ has_rdoc: