[Lldb-commits] [PATCH] D55827: Update current working directory to avoid test crashes

Tatyana Krasnukha via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Dec 18 08:06:01 PST 2018


tatyana-krasnukha created this revision.
tatyana-krasnukha added reviewers: JDevlieghere, zturner.
tatyana-krasnukha added a project: LLDB.
Herald added subscribers: lldb-commits, abidh.

Running `dotest.py` with a path to tests directory results in:

  terminate called after throwing an instance of 'std::logic_error'
                what():  basic_string::_M_construct null not valid
  Aborted

for some tests. For example, when a test executes command "script import relative_path.py" the exception happens in ScriptInterpreterPython::LoadScriptingModule at the line

  std::string directory = target_file.GetDirectory().GetCString();

because GetCString returns nullptr.

The reason of such behavior is that llvm::RealFileSystem returns cached current working directory value until it will be updated with setCurrentWorkingDirectory. So, we permanently have cwd == directory of the first test, FileSystem::Resolve doesn't find the file and just returns the original value.

P.S. What about FileSpec::GetDirectory and FileSpec::GetFileName those never return nullptr? There is a lot of code that doesn't check result on nullptr (look at llvm.org/pr37054, for example). I made a patch where these functions return empty strings instead of nullptr, but some tests fail as they expect the result is None. Other API users can be broken also.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D55827

Files:
  include/lldb/API/SBHostOS.h
  include/lldb/Host/FileSystem.h
  packages/Python/lldbsuite/test/lldbtest.py
  scripts/interface/SBHostOS.i
  source/API/SBHostOS.cpp
  source/Host/common/FileSystem.cpp


Index: source/Host/common/FileSystem.cpp
===================================================================
--- source/Host/common/FileSystem.cpp
+++ source/Host/common/FileSystem.cpp
@@ -247,6 +247,11 @@
   file_spec.SetIsResolved(true);
 }
 
+bool FileSystem::SetCurrentWorkingDirectory(const llvm::Twine &cwd) {
+  std::error_code error = m_fs->setCurrentWorkingDirectory(cwd);
+  return !error;
+}
+
 std::shared_ptr<DataBufferLLVM>
 FileSystem::CreateDataBuffer(const llvm::Twine &path, uint64_t size,
                              uint64_t offset) {
Index: source/API/SBHostOS.cpp
===================================================================
--- source/API/SBHostOS.cpp
+++ source/API/SBHostOS.cpp
@@ -94,6 +94,10 @@
   return sb_fspec;
 }
 
+bool SBHostOS::SetCurrentWorkingDirectory(const char *cwd) {
+  return cwd ? FileSystem::Instance().SetCurrentWorkingDirectory(cwd) : false;
+}
+
 lldb::thread_t SBHostOS::ThreadCreate(const char *name,
                                       lldb::thread_func_t thread_function,
                                       void *thread_arg, SBError *error_ptr) {
Index: scripts/interface/SBHostOS.i
===================================================================
--- scripts/interface/SBHostOS.i
+++ scripts/interface/SBHostOS.i
@@ -24,6 +24,9 @@
 
     static lldb::SBFileSpec
     GetUserHomeDirectory ();
+        
+    static bool
+    SetCurrentWorkingDirectory(const char *cwd);
 
     static void
     ThreadCreated (const char *name);
Index: packages/Python/lldbsuite/test/lldbtest.py
===================================================================
--- packages/Python/lldbsuite/test/lldbtest.py
+++ packages/Python/lldbsuite/test/lldbtest.py
@@ -552,6 +552,9 @@
                 print("Change dir to:", full_dir, file=sys.stderr)
             os.chdir(full_dir)
 
+        if not lldb.SBHostOS.SetCurrentWorkingDirectory(full_dir):
+            raise Exception("Failed to re-write cached cwd value.")
+
         # Set platform context.
         cls.platformContext = lldbplatformutil.createPlatformContext()
 
Index: include/lldb/Host/FileSystem.h
===================================================================
--- include/lldb/Host/FileSystem.h
+++ include/lldb/Host/FileSystem.h
@@ -130,6 +130,11 @@
   void Resolve(FileSpec &file_spec);
   /// @}
 
+  /// Set current working directory.
+  /// @{
+  bool SetCurrentWorkingDirectory(const llvm::Twine &cwd);
+  /// @}
+
   //// Create memory buffer from path.
   /// @{
   std::shared_ptr<DataBufferLLVM> CreateDataBuffer(const llvm::Twine &path,
Index: include/lldb/API/SBHostOS.h
===================================================================
--- include/lldb/API/SBHostOS.h
+++ include/lldb/API/SBHostOS.h
@@ -25,6 +25,8 @@
 
   static lldb::SBFileSpec GetUserHomeDirectory();
 
+  static bool SetCurrentWorkingDirectory(const char *cwd);
+
   static void ThreadCreated(const char *name);
 
   static lldb::thread_t ThreadCreate(const char *name,


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55827.178673.patch
Type: text/x-patch
Size: 3039 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20181218/0afdca31/attachment.bin>


More information about the lldb-commits mailing list