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

Ted kremenek kremenek at apple.com
Wed Nov 26 23:23:25 PST 2014


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> 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> 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, 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> 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 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>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141126/16fd534d/attachment.html>


More information about the cfe-commits mailing list