[clang-tools-extra] [clangd] fix asserts on incompatible paths in CDB (PR #148019)

via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 10 11:16:10 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-tools-extra

Author: Dmitrii Sharshakov (dsseng)

<details>
<summary>Changes</summary>

A compile_commands.json with Windows paths would make clangd assert on a
POSIX system, and vice versa.

Make path traversal functions skip paths of the incompatible format.

Could not invent a test for this one, should be trivial enough.

Fixes #<!-- -->146798


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


1 Files Affected:

- (modified) clang-tools-extra/clangd/GlobalCompilationDatabase.cpp (+6) 


``````````diff
diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
index 7c0eb9651feaa..4d934d268fdfd 100644
--- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
+++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp
@@ -47,6 +47,9 @@ namespace {
 // deepest directory and going up to root. Stops whenever action succeeds.
 void actOnAllParentDirectories(PathRef FileName,
                                llvm::function_ref<bool(PathRef)> Action) {
+  // Skip non-native paths which we cannot traverse or otherwise use.
+  if (!llvm::sys::path::is_absolute(FileName, llvm::sys::path::Style::native))
+    return;
   for (auto Path = absoluteParent(FileName); !Path.empty() && !Action(Path);
        Path = absoluteParent(Path))
     ;
@@ -680,6 +683,9 @@ class DirectoryBasedGlobalCompilationDatabase::BroadcastThread::Filter {
         SearchPaths[I].setPointer(&Dirs[*Parent.Opts.CompileCommandsDir]);
         continue;
       }
+      // Skip non-native paths which we cannot traverse or otherwise use.
+      if (!llvm::sys::path::is_absolute(AllFiles[I], llvm::sys::path::Style::native))
+        continue;
       if (ExitEarly()) // loading config may be slow
         return Filtered;
       WithContext WithProvidedContent(Parent.Opts.ContextProvider(AllFiles[I]));

``````````

</details>


https://github.com/llvm/llvm-project/pull/148019


More information about the cfe-commits mailing list