[PATCH][analyzer] Prevent ccc/c++-analyzer from hanging on Windows.

Anton Yartsev anton.yartsev at gmail.com
Tue Dec 16 15:21:45 PST 2014


Ping!
> Hi Anton,
>
> Jordan, Anna, and I are all away this week on vacation (and not 
> actively on email).  Thanks for the ping and we will circle back with 
> you early next week.
>
> Ted
>
> On Nov 26, 2014, at 3:27 PM, Anton Yartsev <anton.yartsev at gmail.com 
> <mailto:anton.yartsev at gmail.com>> wrote:
>
>> Ping!
>>
>> Attached are an updated patch for ccc-analyzer and a similar patch 
>> for scan-build, please review.
>>
>>> On 06.11.2014 20:27, Jordan Rose wrote:
>>>> I think my point was "why bother forking at all if we're using open 
>>>> to run a subprocess?".
>>> Ah, got it! Attached is an updated patch.
>>>
>>>>
>>>> Also, this will fail if the path contains spaces:
>>> Corrected.
>>>
>>>>
>>>> +    my $ExecLine = join(' ', $Clang, "-###", $mode, @$Args, 
>>>> "2>&1", "|");
>>>> +    open(PS, $ExecLine);
>>>>
>>>> Do newer Perls on newer Windows support the list form of open?
>>> No, at least ActivePerl, StrawberryPerl and Dwimperl.
>>>
>>> Current perl docs state:
>>> 'open to ||-| and |-|| are unsupported. (Win32, RISC OS)' 
>>> (http://perldoc.perl.org/perlport.html#open)
>>> and
>>> 'The open(FOO, "|-") and open(BAR, "-|") constructs are not yet 
>>> implemented.' (http://perldoc.perl.org/perlfork.html)
>>>
>>>> Jordan
>>>>
>>>>
>>>>> On Nov 5, 2014, at 11:54 , Anton Yartsev <anton.yartsev at gmail.com 
>>>>> <mailto:anton.yartsev at gmail.com>> wrote:
>>>>>
>>>>> Ping!
>>>>>> It seems that fork is the only native perl mean for creating 
>>>>>> subprocesses. There is a number of packages that provide means 
>>>>>> for spawning at cpan.org <http://cpan.org>, but they are not 
>>>>>> guarantee to be included at the users perl distribution.
>>>>>>> Looking at this code, it's weird that we're doing this as a 
>>>>>>> fork/exec (or not-exec) at all. Why can't we just spawn a 
>>>>>>> sub-process?
>>>>>>>
>>>>>>> Jordan
>>>>>>>
>>>>>>>
>>>>>>> On Oct 21, 2014, at 6:47 , Anton Yartsev 
>>>>>>> <anton.yartsev at gmail.com <mailto:anton.yartsev at gmail.com>> wrote:
>>>>>>>
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>> Attached is the patch that prevents ccc/c++-analyzer from hang 
>>>>>>>> if launched with ActivePerl or Strawberry Perl interpreters.
>>>>>>>> The patch replaces the code that creates a pipe from child to 
>>>>>>>> parent to the more portable explicit writing to parent, this 
>>>>>>>> prevent interpreters from hang.
>>>>>>>> The conditions for hang are: child should open a pipe to the 
>>>>>>>> parent and parent should read from the child, otherwise no hang.
>>>>>>>>
>>>>>>>> The problem is possibly caused by the bug in emulation of 
>>>>>>>> 'fork' by Perl interpreters on Windows. From perlfork 
>>>>>>>> <http://perldoc.perl.org/perlfork.html> documentation, BUGS 
>>>>>>>> section:
>>>>>>>> "In certain cases, the OS-level handles created by the pipe(), 
>>>>>>>> socket(), and accept() operators are apparently not duplicated 
>>>>>>>> accurately in pseudo-processes. This only happens in some 
>>>>>>>> situations, but where it does happen, it may result in 
>>>>>>>> deadlocks between the read and write ends of pipe handles, or 
>>>>>>>> inability to send or receive data across socket handles."
>>>>>>>>
>>>>>>>> An example from perlfork documentation also hangs:
>>>>>>>>
>>>>>>>> # simulate open(FOO, "-|")
>>>>>>>> sub pipe_from_fork ($) {
>>>>>>>>     my $parent = shift;
>>>>>>>>     pipe $parent, my $child or die;
>>>>>>>>     my $pid = fork();
>>>>>>>>     die "fork() failed: $!" unless defined $pid;
>>>>>>>>     if ($pid) {
>>>>>>>>       close $child;
>>>>>>>>     }
>>>>>>>>     else {
>>>>>>>>       close $parent;
>>>>>>>>       open(STDOUT, ">&=" . fileno($child)) or die;
>>>>>>>>     }
>>>>>>>>   $pid;
>>>>>>>> }
>>>>>>>>
>>>>>>>> if (pipe_from_fork('BAR')) {
>>>>>>>> # parent
>>>>>>>> while (<BAR>) { print; }
>>>>>>>>   close BAR;
>>>>>>>> }
>>>>>>>> else {
>>>>>>>>   # child
>>>>>>>>   print "pipe_from_fork\n";
>>>>>>>>   exit(0);
>>>>>>>> }
>>>>>>>>
>>>>>>>> The hang is not reproduced only with the MSYS Perl.
>>>>>>>>
>>>>>>>> OK to commit?
>>>>>>>> -- 
>>>>>>>> Anton
>>>>>>>> <ccc-analyzer_fork_open_hang.patch>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> Anton
>>>>>
>>>>>
>>>>> -- 
>>>>> Anton
>>>>
>>>
>>>
>>> -- 
>>> Anton
>>
>>
>> -- 
>> Anton
>> <ccc-analyzer_fork_open_hang_v2.patch>
>> <scan-build_fork_open_hang.patch>


-- 
Anton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141217/7402a6d4/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ccc-analyzer_fork_open_hang_v2.patch
Type: text/x-diff
Size: 2022 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141217/7402a6d4/attachment.patch>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: scan-build_fork_open_hang_v2.patch
Type: text/x-diff
Size: 2174 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141217/7402a6d4/attachment-0001.patch>


More information about the cfe-commits mailing list