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

Anton Yartsev anton.yartsev at gmail.com
Mon Mar 23 16:48:49 PDT 2015


Updated the patch, please review!
> 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


-- 
Anton

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150324/2f6bdb6d/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fork_open_hang_v2.patch
Type: text/x-diff
Size: 4298 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150324/2f6bdb6d/attachment.patch>


More information about the cfe-commits mailing list