diff --git a/3rdparty/cppcheck/checksources.pl b/3rdparty/cppcheck/checksources.pl
new file mode 100755
index 0000000000..329ff7d943
--- /dev/null
+++ b/3rdparty/cppcheck/checksources.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use File::Basename;
+use File::Find;
+
+if (scalar @ARGV < 2) {
+ die "Usage: $0
\n";
+}
+
+if (!-e "./ReadMe.cross-compile") {
+ die "ERROR: $0 must be called from Haiku top directory!\n";
+}
+
+my %headers;
+my $dirToCheck = shift @ARGV;
+my $fileToLog = shift @ARGV;
+my $jobs = 1;
+if (scalar @ARGV) {
+ $jobs = shift @ARGV;
+}
+my $headersDirs;
+my $cppcheck;
+
+print "Scanning headers...\n";
+find({ wanted => \&process, no_chdir => 1},
+ ("headers/posix", "headers/libs", "headers/os", "headers/private"));
+
+foreach my $dir (sort keys %headers) {
+ $headersDirs .= "-I $dir ";
+}
+
+print "Running cppcheck tool...\n";
+$cppcheck = "cppcheck -j $jobs --force --auto-dealloc 3rdparty/cppcheck/haiku.lst --enable=exceptRealloc,possibleError,style $headersDirs $dirToCheck 2> $fileToLog";
+
+system($cppcheck);
+
+sub process
+{
+ if (substr($_, -4, 4) eq '.svn') {
+ $File::Find::prune = 1;
+ } else {
+ return if $File::Find::dir eq $_; # skip toplevel folders
+ my $name = (fileparse($_))[0];
+ if (-d $_) {
+ push @{$headers{$File::Find::name}->{subdirs}}, $name;
+ return;
+ }
+ }
+}
+
diff --git a/3rdparty/cppcheck/haiku.lst b/3rdparty/cppcheck/haiku.lst
new file mode 100644
index 0000000000..10c2509966
--- /dev/null
+++ b/3rdparty/cppcheck/haiku.lst
@@ -0,0 +1,17 @@
+BAlert
+BButton
+BCheckBox
+BControl
+BMenuBar
+BMenuField
+BMenuItem
+BMenuWindow
+BPopUpMenu
+BRadioButton
+BScrollBar
+BSplitView
+BStringView
+BTextControl
+BView
+BWindow
+