diff --git a/.travis.yml b/.travis.yml
index 70d9e2d211..3f31f4e0d2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -50,8 +50,8 @@ before_script:
script:
- mvn install -DskipTests=true
- mvn test
- - RAILS_ENV=production PATH=$PATH:/tmp/sonar-runner-2.4/bin behave
-
+ - RAILS_ENV=production PATH=$PATH:/tmp/sonar-runner-2.4/bin TestDataFolder=~/build/SonarOpenCommunity/sonar-cxx/integration-tests/testdata behave
+
after_failure:
- cat $SONARHOME/logs/sonar.log
- find . -name "*.log" | xargs cat
diff --git a/integration-tests/features/importing_cppcheck_reports.feature b/integration-tests/features/importing_cppcheck_reports.feature
index b2a28f812c..372228045c 100644
--- a/integration-tests/features/importing_cppcheck_reports.feature
+++ b/integration-tests/features/importing_cppcheck_reports.feature
@@ -75,7 +75,13 @@ Feature: Importing Cppcheck reports
"""
AND the number of violations fed is 0
-
+ Scenario: The reports and issues in the reports have absolute paths
+ GIVEN the project "cppcheck_with_absolute_paths_project"
+ WHEN I run "sonar-runner -X"
+ THEN the analysis finishes successfully
+ AND the server log (if locatable) contains no error/warning messages
+ AND the number of violations fed is 6
+
# This doesnt work. We dont support reports outside of the projects directory,
# although there is no good reason for that(??)
#
diff --git a/integration-tests/testdata/cppcheck_with_absolute_paths_project/reports/cppcheck-v2.xml b/integration-tests/testdata/cppcheck_with_absolute_paths_project/reports/cppcheck-v2.xml
new file mode 100644
index 0000000000..1a332ae443
--- /dev/null
+++ b/integration-tests/testdata/cppcheck_with_absolute_paths_project/reports/cppcheck-v2.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/integration-tests/testdata/cppcheck_with_absolute_paths_project/sonar-project.properties b/integration-tests/testdata/cppcheck_with_absolute_paths_project/sonar-project.properties
new file mode 100644
index 0000000000..ab8d88fd0a
--- /dev/null
+++ b/integration-tests/testdata/cppcheck_with_absolute_paths_project/sonar-project.properties
@@ -0,0 +1,15 @@
+# required metadata
+sonar.projectKey=cppcheck_with_absolute_paths_project
+sonar.projectName=cppcheck_with_absolute_paths_project
+sonar.projectVersion=1.0.0
+sonar.language=c++
+
+# disable SCM support
+sonar.scm.disabled=true
+
+# path to source directories
+sonar.sources=.
+sonar.cxx.includeDirectories=.
+
+# paths to the reports
+sonar.cxx.cppcheck.reportPath=${TestDataFolder}/cppcheck_with_absolute_paths_project/reports/cppcheck-*.xml
diff --git a/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/component1.cc b/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/component1.cc
new file mode 100644
index 0000000000..fc9fd59754
--- /dev/null
+++ b/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/component1.cc
@@ -0,0 +1,50 @@
+#include \
+ "component1.hh"
+
+/**
+ * Does something
+ *
+ * @return: an int indicating something
+ */
+int Bar::foo(){
+ // single line comment
+
+ /*
+ * multi-line comment
+ */
+ int \
+ x; //unused variable
+
+ return 111;
+}
+
+
+void Bar::do_valgrind_errors(){
+ ///// lets provoke some valgrind errors /////
+
+ // Memory leak (definitely lost)
+ new float();
+
+ // Condition depends on undefined value
+ int a;
+ if(a) a = a*a;
+
+ // Invalid read
+ int* ip = new int(0);
+ delete ip;
+ int i = *ip;
+
+ // Invalid write
+ ip = new int(0);
+ delete ip;
+ *ip = 1;
+
+ // Invalid free
+ ip = new int(0);
+ delete ip;
+ delete ip;
+
+ // Mismatched free() / delete / delete []
+ ip = new int(0);
+ delete [] ip;
+}
diff --git a/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/component1.hh b/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/component1.hh
new file mode 100644
index 0000000000..de73f1a274
--- /dev/null
+++ b/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/component1.hh
@@ -0,0 +1,9 @@
+#ifndef COMPONENT1_HH
+#define COMPONENT1_HH
+
+class Bar {
+public:
+ int foo();
+ void do_valgrind_errors();
+};
+#endif
diff --git a/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/main.cc b/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/main.cc
new file mode 100644
index 0000000000..716bdf7734
--- /dev/null
+++ b/integration-tests/testdata/cppcheck_with_absolute_paths_project/src/sample/main.cc
@@ -0,0 +1,6 @@
+#include
+
+int main(int argc, char* argv[])
+{
+ return Bar().foo();
+}
diff --git a/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/CxxProjectBuilder.java b/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/CxxProjectBuilder.java
index 8b983ace3f..f94355a54d 100644
--- a/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/CxxProjectBuilder.java
+++ b/sonar-cxx-plugin/src/main/java/org/sonar/plugins/cxx/CxxProjectBuilder.java
@@ -80,6 +80,19 @@ public void build(Context context) {
LOG.debug("property expansion: key '{}'; value '{}' => '{}'", new Object[]{key, oldValue, newValue});
}
}
+
+ // add list of available property keys
+ if (LOG.isDebugEnabled()) {
+ StringBuilder sb = new StringBuilder("analysis parameters:\n");
+ for (String key : props.stringPropertyNames()) {
+ sb.append(" ");
+ sb.append(key);
+ sb.append("=");
+ sb.append(props.getProperty(key));
+ sb.append("\n");
+ }
+ LOG.debug(sb.toString());
+ }
}
/**