[clang] [clang][analyzer] Delay checking the model-path (PR #150133)

Jan Svoboda via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 2 10:04:37 PDT 2025


https://github.com/jansvoboda11 updated https://github.com/llvm/llvm-project/pull/150133

>From fd5445b09c1c32da72d41ac72b4dcd937d9676bf Mon Sep 17 00:00:00 2001
From: Jan Svoboda <jan_svoboda at apple.com>
Date: Tue, 22 Jul 2025 15:42:28 -0700
Subject: [PATCH] [clang][analyzer] Delay checking the model-path

---
 clang/lib/Frontend/CompilerInvocation.cpp           |  5 -----
 clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp | 11 ++++++++++-
 clang/test/Analysis/model-file-missing.cpp          |  3 +++
 3 files changed, 13 insertions(+), 6 deletions(-)
 create mode 100644 clang/test/Analysis/model-file-missing.cpp

diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 29f9cf3a7f0e3..ff3aec59f321c 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -1323,11 +1323,6 @@ static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts,
   if (!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir))
     Diags->Report(diag::err_analyzer_config_invalid_input) << "ctu-dir"
                                                            << "a filename";
-
-  if (!AnOpts.ModelPath.empty() &&
-      !llvm::sys::fs::is_directory(AnOpts.ModelPath))
-    Diags->Report(diag::err_analyzer_config_invalid_input) << "model-path"
-                                                           << "a filename";
 }
 
 /// Generate a remark argument. This is an inverse of `ParseOptimizationRemark`.
diff --git a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
index 7bc34f61255f4..975c72af0b031 100644
--- a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
@@ -9,6 +9,7 @@
 #include "ModelInjector.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclObjC.h"
+#include "clang/Basic/DiagnosticDriver.h"
 #include "clang/Basic/LangStandard.h"
 #include "clang/Basic/Stack.h"
 #include "clang/Frontend/ASTUnit.h"
@@ -24,7 +25,15 @@
 using namespace clang;
 using namespace ento;
 
-ModelInjector::ModelInjector(CompilerInstance &CI) : CI(CI) {}
+ModelInjector::ModelInjector(CompilerInstance &CI) : CI(CI) {
+  if (CI.getAnalyzerOpts().ShouldEmitErrorsOnInvalidConfigValue &&
+      !CI.getAnalyzerOpts().ModelPath.empty()) {
+    auto S = CI.getVirtualFileSystem().status(CI.getAnalyzerOpts().ModelPath);
+    if (!S || S->getType() != llvm::sys::fs::file_type::directory_file)
+      CI.getDiagnostics().Report(diag::err_analyzer_config_invalid_input)
+          << "model-path" << "a filename";
+  }
+}
 
 Stmt *ModelInjector::getBody(const FunctionDecl *D) {
   onBodySynthesis(D);
diff --git a/clang/test/Analysis/model-file-missing.cpp b/clang/test/Analysis/model-file-missing.cpp
new file mode 100644
index 0000000000000..c9dfb4ec1b244
--- /dev/null
+++ b/clang/test/Analysis/model-file-missing.cpp
@@ -0,0 +1,3 @@
+// RUN: not %clang_analyze_cc1 -analyzer-checker=core -analyzer-config model-path=%t/blah %s -o - 2>&1 | FileCheck %s
+// CHECK: error: invalid input for analyzer-config option 'model-path', that expects a filename value
+// CHECK-NEXT: 1 error generated



More information about the cfe-commits mailing list