diff --git a/lib/fasterer/cli.rb b/lib/fasterer/cli.rb
index <HASH>..<HASH> 100644
--- a/lib/fasterer/cli.rb
+++ b/lib/fasterer/cli.rb
@@ -5,6 +5,7 @@ module Fasterer
     def self.execute
       file_traverser = Fasterer::FileTraverser.new('.')
       file_traverser.traverse
+      abort if file_traverser.offenses_found?
     end
   end
 end
diff --git a/lib/fasterer/file_traverser.rb b/lib/fasterer/file_traverser.rb
index <HASH>..<HASH> 100644
--- a/lib/fasterer/file_traverser.rb
+++ b/lib/fasterer/file_traverser.rb
@@ -43,9 +43,14 @@ module Fasterer
       end
     end
 
+    def offenses_found?
+      !!offenses_found
+    end
+
     private
 
     attr_reader :parse_error_paths
+    attr_accessor :offenses_found
 
     def nil_config_file
       { SPEEDUPS_KEY => {}, EXCLUDE_PATHS_KEY => [] }
@@ -57,7 +62,10 @@ module Fasterer
     rescue RubyParser::SyntaxError, Racc::ParseError, Timeout::Error
       parse_error_paths.push(path)
     else
-      output(analyzer) if offenses_grouped_by_type(analyzer).any?
+      if offenses_grouped_by_type(analyzer).any?
+        output(analyzer)
+        self.offenses_found = true
+      end
     end
 
     def scannable_files
Abort if the file traverser found an offense

By exiting the application with a nonzero status when an offense is
found, fasterer can be integrated into continuous integration to prevent slow
code from being committed.