[Lldb-commits] [PATCH] FileSpec::Resolve should not turn a filename-only FileSpec into a qualified FileSpec if that file doesn't exist
Zachary Turner
zturner at google.com
Sat Feb 7 11:54:03 PST 2015
http://lists.cs.uiuc.edu/pipermail/lldb-dev/2014-October/005551.html
Here's a thread that provides some context for why this was changed.
Your failure mode mentions invoking "lldb ls". If FileSpec::Resolve just
ends up returning "ls" unchanged, who actually resolves it? In the thread i
linked above, it seems i was also dealing with the same issue. Perhaps it's
time to add a function to resolve an executable using PATH? We could put it
in llvm::sys::fs and call it llvm::sys::resolve_executable(StringRef Exe,
bool use_path). Seems generally useful outside of lldb. The LLDB could just
always call this function before constructing a FileSpec to a target
executable.
On Fri, Feb 6, 2015 at 5:35 PM Zachary Turner <zturner at google.com> wrote:
> Could we add a test that verifies the behavior of this function? Greg
> created an SBFileSpec test recently in lldb/test/functionalities/paths/TestPaths.py.
> As long as we don't use a builtin command like ls or something like it
> should be fine. Instead you could use something like sys.executable, then
> the os.path module to get out the filename, then verify that after you
> resolve it, it matches sys.executable.
>
>
> ================
> Comment at: source/Host/common/FileSpec.cpp:167-173
> @@ -166,1 +166,9 @@
>
> + // Save a copy of the original path that's passed in
> + char original_path[PATH_MAX];
> + ::strncpy (original_path, path.data(), sizeof (original_path));
> + if (path.size() < sizeof (original_path))
> + original_path[path.size()] = '\0';
> + else
> + original_path[sizeof (original_path) - 1] = '\0';
> +
> ----------------
> You can write this like this:
>
> llvm::SmallString<PATH_MAX> original_path(path.begin(), path.end());
>
> ================
> Comment at: source/Host/common/FileSpec.cpp:177-183
> @@ +176,9 @@
> +
> + // Get the resolved path as a char*, call stat() to see if it exists
> + char resolved_path[PATH_MAX];
> + ::strncpy (resolved_path, path.data(), sizeof (resolved_path));
> + if (path.size() < sizeof (original_path))
> + resolved_path[path.size()] = '\0';
> + else
> + resolved_path[sizeof (resolved_path) - 1] = '\0';
> +
> ----------------
> I'm preeeety sure that make_absolute() guarantees the result will be null
> terminated. But not quite 100%. If you can determine that it's guaranteed
> to be null terminated, you can replace all of this with path.data(), which
> returns a char*. If you want to be extra certain though, you can still
> make this shorter by writing this instead:
>
> path.push_back(0);
> path.pop_back();
> if (stat(path.data())) // path.data() is now definitely null terminated.
>
> ================
> Comment at: source/Host/common/FileSpec.cpp:190-191
> @@ +189,4 @@
> + // Return the original path instead
> + path.resize (strlen (original_path) + 1);
> + memcpy (path.data(), original_path, strlen (original_path) + 1);
> + }
> ----------------
> This can just be path = original_path;
>
> http://reviews.llvm.org/D7477
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150207/7ef919c3/attachment.html>
More information about the lldb-commits
mailing list