diff options
author | Christian Kandeler <christian.kandeler@digia.com> | 2014-01-17 10:26:08 +0100 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-01-17 10:42:35 +0100 |
commit | 8ae6b0c7115033fb957dc5cfca97da525dc0182a (patch) | |
tree | 4e798b8072d3891fe7ee932cba56527068f67444 | |
parent | 36b39085f0ad49b6fd35e7ac11c196b26cca6723 (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.cpp | 4 | ||||
-rw-r--r-- | src/lib/api/internaljobs.h | 2 | ||||
-rw-r--r-- | src/lib/buildgraph/buildgraph.cpp | 6 |
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; |