Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

On windows %INCLUDE% ending in \ leads to clang hanging when trying to kick of new process #16174

Closed
llvmbot opened this issue Apr 21, 2013 · 4 comments
Assignees
Labels
bugzilla Issues migrated from bugzilla build-problem clang Clang issues not falling into any other category portability

Comments

@llvmbot
Copy link
Member

llvmbot commented Apr 21, 2013

Bugzilla Link 15802
Resolution FIXED
Resolved on Apr 22, 2013 14:10
Version trunk
OS Windows NT
Attachments possible patch, fixed issue with first patch (setting pointers in args)
Reporter LLVM Bugzilla Contributor
CC @zmodem,@pogo59,@rnk

Extended Description

On Windows, invoking "clang test.c" makes clang hang during startup if %INCLUDE% ends in a \ and presumably some similar conditions as well.

The problem has been described by user qble on http://stackoverflow.com/questions/15992645/clang-compiler-hangs-on-windows

When clang gets invoked with actual work, it assembles a list of arguments and kicks of a new process. Among those arguments is the include environment variable on windows. In case this variable contains spaces or some other (e.g. "C:\Program Files\SomeVendor\Include") or some other special characters, clang adds quotation marks around this string so that it stays a single argument to the new process. If the argument ends in an uneven number (typically one) of backslashes though, the quotation mark becomes escaped and thus instead of a invocation like

clang "C:\Program Files\SomeVendor\Include\" someOtherArg

which makes

argv[1] = "C:\Program Files\SomeVendor\Include\"
argv[2] = "someOtherArg"

it becomes

clang "C:\Program Files\SomeVendor\Include" someOtherArg

which is a unterminated

argv[1] = "C:\Program Files\SomeVendor\Include" someOtherArg ...

The problem can easily be fixed by escaping uneven trailing backslashes by just adding another one. I have added a pach to llvm\lib\Support\Windows which fixes the problem, I didn't feel like messing around with c-strings like the rest of that code does. If you feel strongly about it, I could also write a patch in keeping with the c-style code and without unnecessary copies (though I don't think that code is remotely performance critical)

@llvmbot
Copy link
Member Author

llvmbot commented Apr 21, 2013

assigned to @rnk

@rnk
Copy link
Collaborator

rnk commented Apr 22, 2013

Thanks for the report. BTW, here's the best reference I could find on MSDN for the quoting rules:
http://msdn.microsoft.com/en-us/library/17w5ykft%28v=vs.85%29.aspx

I think your solution may be flawed for strings with odd numbers of backslashes like "pretend\arg\". Your code will transform that to "pretend\arg\\", which when unquoted in the child process should become "pretend\arg\".

I'll look into implementing the proper quoting rules.

@llvmbot
Copy link
Member Author

llvmbot commented Apr 22, 2013

Yes, you're right. I was mistaken about the parsing rules. Your link is very helpful indeed.

My patch is incorrect for arguments ending in more than one backslash and not only when the number is uneven. For example:

C:\dev\test\Win32\Debug>test.exe this isatest\
argv[0] = "qt_console_project.exe"
argv[1] = "this"
argv[2] = "isatest\"

C:\dev\test\Win32\Debug>test.exe "this isatest\"
argv[0] = "qt_console_project.exe"
argv[1] = "this isatest"

I believe the number of trailing \ has to be doubled if and only if quotes will be added, right?

@rnk
Copy link
Collaborator

rnk commented Apr 22, 2013

Right, as well as before any quote in the original string.

I implemented that in r180035, and your test case works for me with clang now.

@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 4, 2021
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bugzilla Issues migrated from bugzilla build-problem clang Clang issues not falling into any other category portability
Projects
None yet
Development

No branches or pull requests

2 participants