aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@digia.com>2014-01-17 10:26:08 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-01-17 10:42:35 +0100
commit8ae6b0c7115033fb957dc5cfca97da525dc0182a (patch)
tree4e798b8072d3891fe7ee932cba56527068f67444
parent36b39085f0ad49b6fd35e7ac11c196b26cca6723 (diff)
Tighten sanity checks, part XXXIII.
- Check whether the artifacts in a child list actually appears in their products' artifact list. - Do sanity checking right before storing the build graph. This makes sure that a corrupted build graph never gets written to disk. Change-Id: I06b02b97c3621ecdc1f6dae8e6ce818519f9736e Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r--src/lib/api/internaljobs.cpp4
-rw-r--r--src/lib/api/internaljobs.h2
-rw-r--r--src/lib/buildgraph/buildgraph.cpp6
3 files changed, 9 insertions, 3 deletions
diff --git a/src/lib/api/internaljobs.cpp b/src/lib/api/internaljobs.cpp
index e0b0afa0a..7a16ff2ad 100644
--- a/src/lib/api/internaljobs.cpp
+++ b/src/lib/api/internaljobs.cpp
@@ -31,6 +31,7 @@
#include "jobs.h"
#include <buildgraph/artifactcleaner.h>
+#include <buildgraph/buildgraph.h>
#include <buildgraph/buildgraphloader.h>
#include <buildgraph/productbuilddata.h>
#include <buildgraph/projectbuilddata.h>
@@ -132,9 +133,10 @@ void InternalJob::shareObserverWith(InternalJob *otherJob)
m_observer = otherJob->m_observer;
}
-void InternalJob::storeBuildGraph(const TopLevelProjectConstPtr &project)
+void InternalJob::storeBuildGraph(const TopLevelProjectPtr &project)
{
try {
+ doSanityChecks(project, logger());
project->store(logger());
} catch (const ErrorInfo &error) {
logger().printWarning(error);
diff --git a/src/lib/api/internaljobs.h b/src/lib/api/internaljobs.h
index 017013a47..1987e4874 100644
--- a/src/lib/api/internaljobs.h
+++ b/src/lib/api/internaljobs.h
@@ -72,7 +72,7 @@ protected:
JobObserver *observer() const { return m_observer; }
void setError(const ErrorInfo &error) { m_error = error; }
void setTimed(bool timed) { m_timed = timed; }
- void storeBuildGraph(const TopLevelProjectConstPtr &project);
+ void storeBuildGraph(const TopLevelProjectPtr &project);
signals:
void finished(Internal::InternalJob *job);
diff --git a/src/lib/buildgraph/buildgraph.cpp b/src/lib/buildgraph/buildgraph.cpp
index d80aebe84..88db53e20 100644
--- a/src/lib/buildgraph/buildgraph.cpp
+++ b/src/lib/buildgraph/buildgraph.cpp
@@ -436,8 +436,12 @@ static void doSanityChecksForProduct(const ResolvedProductConstPtr &product, con
QBS_CHECK(artifact->product == product);
foreach (const Artifact * const parent, artifact->parents)
QBS_CHECK(parent->children.contains(artifact));
- foreach (const Artifact * const child, artifact->children)
+ foreach (Artifact * const child, artifact->children) {
QBS_CHECK(child->parents.contains(artifact));
+ QBS_CHECK(child->product);
+ QBS_CHECK(child->product->buildData);
+ QBS_CHECK(child->product->buildData->artifacts.contains(child));
+ }
foreach (Artifact * const child, artifact->childrenAddedByScanner)
QBS_CHECK(artifact->children.contains(child));
const TransformerConstPtr transformer = artifact->transformer;