llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-ssaf

Author: Balázs Benics (steakhal)

<details>
<summary>Changes</summary>

Extractors might not always add summaries for all the TUs. If they don't add 
any summaries to the TU result, then loading this summary for a summary 
analysis would cause a failure.

This patch handles the situation gracefully by accepting such cases.

Split from: #<!-- -->209354

---
Full diff: https://github.com/llvm/llvm-project/pull/211342.diff


3 Files Affected:

- (modified) 
clang/lib/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisDriver.cpp 
(+7-21) 
- (modified) clang/test/Analysis/Scalable/ssaf-analyzer/analyzer.test (+4-4) 
- (modified) 
clang/unittests/ScalableStaticAnalysis/WholeProgramAnalysis/AnalysisDriverTest.cpp
 (+22-12) 


``````````diff
diff --git 
a/clang/lib/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisDriver.cpp 
b/clang/lib/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisDriver.cpp
index f60c916e10b67..61e418a2333fa 100644
--- 
a/clang/lib/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisDriver.cpp
+++ 
b/clang/lib/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisDriver.cpp
@@ -102,30 +102,16 @@ AnalysisDriver::toposort(llvm::ArrayRef<AnalysisName> 
Roots) {
 
 llvm::Error AnalysisDriver::executeSummaryAnalysis(SummaryAnalysisBase 
&Summary,
                                                    WPASuite &Suite) const {
-  SummaryName SN = Summary.getSummaryName();
-  auto DataIt = LU->Data.find(SN);
-  if (DataIt == LU->Data.end()) {
-    return ErrorBuilder::create(std::errc::invalid_argument,
-                                "no data for analysis '{0}' in LUSummary",
-                                Summary.getAnalysisName())
-        .build();
-  }
-
-  if (auto Err = Summary.initialize()) {
+  if (auto Err = Summary.initialize())
     return Err;
-  }
 
-  for (auto &[Id, EntitySummary] : DataIt->second) {
-    if (auto Err = Summary.add(Id, *EntitySummary)) {
-      return Err;
-    }
+  auto DataIt = LU->Data.find(Summary.getSummaryName());
+  if (DataIt != LU->Data.end()) {
+    for (auto &[Id, EntitySummary] : DataIt->second)
+      if (auto Err = Summary.add(Id, *EntitySummary))
+        return Err;
   }
-
-  if (auto Err = Summary.finalize()) {
-    return Err;
-  }
-
-  return llvm::Error::success();
+  return Summary.finalize();
 }
 
 llvm::Error AnalysisDriver::executeDerivedAnalysis(DerivedAnalysisBase 
&Derived,
diff --git a/clang/test/Analysis/Scalable/ssaf-analyzer/analyzer.test 
b/clang/test/Analysis/Scalable/ssaf-analyzer/analyzer.test
index 0abdcef15a449..7bc8602abc36b 100644
--- a/clang/test/Analysis/Scalable/ssaf-analyzer/analyzer.test
+++ b/clang/test/Analysis/Scalable/ssaf-analyzer/analyzer.test
@@ -15,13 +15,13 @@
 // UNKNOWN: no analysis registered for 'AnalysisName(NoSuchAnalysis)'
 
 // ============================================================================
-// Error: valid analysis name but LUSummary lacks entity data for it
+// Success: Analyese might not add summaries in every run.
+// Valid analysis name but LUSummary lacks entity data for it is not an error.
 // ============================================================================
 
-// RUN: not %clang-ssaf-analyzer-with-plugin %S/Inputs/lu-tags-only.json \
+// RUN: %clang-ssaf-analyzer-with-plugin %S/Inputs/lu-tags-only.json \
 // RUN:   -o %t/missing-data.json -a PairsAnalysisResult 2>&1 \
-// RUN:   | FileCheck %s --check-prefix=MISSING-DATA
-// MISSING-DATA: no data for analysis 'AnalysisName(PairsAnalysisResult)' in 
LUSummary
+// RUN:   | count 0
 
 // ============================================================================
 // Success: run TagsAnalysisResult only (single analysis)
diff --git 
a/clang/unittests/ScalableStaticAnalysis/WholeProgramAnalysis/AnalysisDriverTest.cpp
 
b/clang/unittests/ScalableStaticAnalysis/WholeProgramAnalysis/AnalysisDriverTest.cpp
index 95077675fb2ec..9e518f08cc7de 100644
--- 
a/clang/unittests/ScalableStaticAnalysis/WholeProgramAnalysis/AnalysisDriverTest.cpp
+++ 
b/clang/unittests/ScalableStaticAnalysis/WholeProgramAnalysis/AnalysisDriverTest.cpp
@@ -468,15 +468,20 @@ TEST_F(AnalysisDriverTest, RunByName) {
           "no result for 'AnalysisName(Analysis2)' in WPASuite"));
 }
 
-// run(names) — error when a requested name has no data in LUSummary.
-TEST_F(AnalysisDriverTest, RunByNameErrorMissingData) {
+// run(names) — a requested name with no data in the LUSummary yields an empty
+// (but initialized and finalized) result rather than an error.
+TEST_F(AnalysisDriverTest, RunByNameEmptyWhenMissingData) {
   auto LU = makeLUSummary();
   AnalysisDriver Driver(std::move(LU));
 
-  EXPECT_THAT_EXPECTED(
-      Driver.run({AnalysisName("Analysis1")}),
-      llvm::FailedWithMessage(
-          "no data for analysis 'AnalysisName(Analysis1)' in LUSummary"));
+  auto WPAOrErr = Driver.run({AnalysisName("Analysis1")});
+  ASSERT_THAT_EXPECTED(WPAOrErr, llvm::Succeeded());
+
+  auto R1OrErr = WPAOrErr->get<Analysis1Result>();
+  ASSERT_THAT_EXPECTED(R1OrErr, llvm::Succeeded());
+  EXPECT_TRUE(R1OrErr->Entries.empty());
+  EXPECT_TRUE(R1OrErr->WasInitialized);
+  EXPECT_TRUE(R1OrErr->WasFinalized);
 }
 
 // run(names) — error when a requested name has no registered analysis.
@@ -522,15 +527,20 @@ TEST_F(AnalysisDriverTest, RunByType) {
           "no result for 'AnalysisName(Analysis2)' in WPASuite"));
 }
 
-// run<ResultTs...>() — error when a requested type has no data in LUSummary.
-TEST_F(AnalysisDriverTest, RunByTypeErrorMissingData) {
+// run<ResultTs...>() — a requested type with no data in the LUSummary yields 
an
+// empty (but initialized and finalized) result rather than an error.
+TEST_F(AnalysisDriverTest, RunByTypeEmptyWhenMissingData) {
   auto LU = makeLUSummary();
   AnalysisDriver Driver(std::move(LU));
 
-  EXPECT_THAT_EXPECTED(
-      Driver.run<Analysis1Result>(),
-      llvm::FailedWithMessage(
-          "no data for analysis 'AnalysisName(Analysis1)' in LUSummary"));
+  auto WPAOrErr = Driver.run<Analysis1Result>();
+  ASSERT_THAT_EXPECTED(WPAOrErr, llvm::Succeeded());
+
+  auto R1OrErr = WPAOrErr->get<Analysis1Result>();
+  ASSERT_THAT_EXPECTED(R1OrErr, llvm::Succeeded());
+  EXPECT_TRUE(R1OrErr->Entries.empty());
+  EXPECT_TRUE(R1OrErr->WasInitialized);
+  EXPECT_TRUE(R1OrErr->WasFinalized);
 }
 
 // contains() — present entries return true; absent entries return false.

``````````

</details>


https://github.com/llvm/llvm-project/pull/211342
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to