From: Andrew Reynolds Date: Tue, 6 Oct 2020 14:31:16 +0000 (-0500) Subject: (proof-new) Allow null proofs from generators in LazyCDProof (#5196) X-Git-Tag: cvc5-1.0.0~2748 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6d663abe421c07976755c224180b1a1ee93442f6;p=cvc5.git (proof-new) Allow null proofs from generators in LazyCDProof (#5196) In some cases, a proof generator provided to a LazyCDProof may provide a null proof, which causes a segfault on proof-new currently. This PR makes LazyCDProof robust to this case; nullptr is interpreted as the fact is an assumption. --- diff --git a/src/expr/lazy_proof.cpp b/src/expr/lazy_proof.cpp index d66a8984b..a96e30fde 100644 --- a/src/expr/lazy_proof.cpp +++ b/src/expr/lazy_proof.cpp @@ -83,16 +83,27 @@ std::shared_ptr LazyCDProof::getProofFor(Node fact) // the current proof. Instead, it is only linked, and ignored on // future calls to getProofFor due to the check above. std::shared_ptr pgc = pg->getProofFor(cfactGen); - if (isSym) + // If the proof was null, then the update is not performed. This is + // not considered an error, since this behavior is equivalent to + // if pg had provided the proof (ASSUME cfactGen). Ensuring the + // proper behavior wrt closed proofs should be done outside this + // method. + if (pgc != nullptr) { - d_manager->updateNode(cur, PfRule::SYMM, {pgc}, {}); - } - else - { - d_manager->updateNode(cur, pgc.get()); + Trace("lazy-cdproof-gen") + << "LazyCDProof: stored proof: " << *pgc.get() << std::endl; + + if (isSym) + { + d_manager->updateNode(cur, PfRule::SYMM, {pgc}, {}); + } + else + { + d_manager->updateNode(cur, pgc.get()); + } + Trace("lazy-cdproof") << "LazyCDProof: Successfully added fact for " + << cfactGen << std::endl; } - Trace("lazy-cdproof") << "LazyCDProof: Successfully added fact for " - << cfactGen << std::endl; } else { diff --git a/src/expr/proof_node_manager.cpp b/src/expr/proof_node_manager.cpp index 9f60a49e4..8ed9779d3 100644 --- a/src/expr/proof_node_manager.cpp +++ b/src/expr/proof_node_manager.cpp @@ -254,6 +254,8 @@ bool ProofNodeManager::updateNode( bool ProofNodeManager::updateNode(ProofNode* pn, ProofNode* pnr) { + Assert(pn != nullptr); + Assert(pnr != nullptr); if (pn->getResult() != pnr->getResult()) { return false; @@ -296,6 +298,7 @@ bool ProofNodeManager::updateNodeInternal( const std::vector& args, bool needsCheck) { + Assert(pn != nullptr); // ---------------- check for cyclic std::unordered_map visited; std::unordered_map::iterator it;