Yes, you are correct: clang implicitly marks indirect parameters with 
__autoreleasing.

The whole purpose of Wblock-capture-autoreleasing (which was committed in 
r285031) is to inform the users that clang has implicitly marked an 
out-parameter as __autoreleasing. clang doesn’t warn if the user explicitly 
marks the parameter __autoreleasing.

> On Feb 13, 2017, at 8:09 AM, Nico Weber <tha...@chromium.org> wrote:
> 
> If I'm understanding you correctly, you're saying that clang implicitly marks 
> the indirect NSError** parameter with __autoreleasing, so there's no bug 
> here. Is that correct? If so, should Wblock-capture-autoreleasing just not 
> fire on parameters that are already implicitly marked as __autoreleasing?
> 
> On Mon, Feb 13, 2017 at 1:54 AM, Akira Hatanaka <ahatan...@apple.com 
> <mailto:ahatan...@apple.com>> wrote:
> Hi Nico,
> 
> The documentation might confuse people now that the warning is on by default, 
> but it’s correct as clang still qualifies indirect parameters with 
> __autoreleasing. We had to add this warning and turn it on by default because 
> a lot of people capture indirect parameters in their code not realizing the 
> object assigned might get released by an autorelease pool.
> 
> Perhaps we can change the warning message or the documentation to make it 
> clear that the parameter has been implicitly marked __autoreleasing 
> regardless.
> 
>> On Feb 11, 2017, at 11:54 AM, Nico Weber <tha...@chromium.org 
>> <mailto:tha...@chromium.org>> wrote:
>> 
>> Hi Akira,
>> 
>> this fires in internal chrome/ios code like so:
>> 
>> somefile.m: error: block captures an autoreleasing out-parameter, which may 
>> result in use-after-free bugs [-Werror,-Wblock-capture-autoreleasing]
>>           if (error) {
>>               ^
>> somefile.m: note: declare the parameter __autoreleasing explicitly to 
>> suppress this warning
>> - (NSDictionary *)fooWithError:(NSError **)error {
>>                                                   ^
>>                                                   __autoreleasing
>> somefile.m: note: declare the parameter __strong or capture a __block 
>> __strong variable to keep values alive across autorelease pools
>> 
>> 
>> A colleague points out that 
>> http://clang.llvm.org/docs/AutomaticReferenceCounting.html#indirect-parameters
>>  
>> <http://clang.llvm.org/docs/AutomaticReferenceCounting.html#indirect-parameters>
>>  suggests NSError ** should "be implicitly qualified with __autoreleasing." 
>> Is that a bug in the implementation of the warning, is 
>> AutomaticReferenceCounting.html incorrect, or are we just misunderstanding 
>> that document?
>> 
>> Thanks,
>> Nico
>> 
>> On Thu, Jan 26, 2017 at 1:51 PM, Akira Hatanaka via cfe-commits 
>> <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:
>> Author: ahatanak
>> Date: Thu Jan 26 12:51:10 2017
>> New Revision: 293199
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=293199&view=rev 
>> <http://llvm.org/viewvc/llvm-project?rev=293199&view=rev>
>> Log:
>> Turn on -Wblock-capture-autoreleasing by default.
>> 
>> Turning on the warning by default helps the users as it's a common
>> mistake to capture out-parameters in a block without ensuring the object
>> assigned doesn't get released.
>> 
>> rdar://problem/30200058 <>
>> 
>> Modified:
>>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>     cfe/trunk/test/SemaObjC/arc.m
>> 
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=293199&r1=293198&r2=293199&view=diff
>>  
>> <http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=293199&r1=293198&r2=293199&view=diff>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Jan 26 12:51:10 
>> 2017
>> @@ -5185,7 +5185,7 @@ def err_arc_inconsistent_property_owners
>>  def warn_block_capture_autoreleasing : Warning<
>>    "block captures an autoreleasing out-parameter, which may result in "
>>    "use-after-free bugs">,
>> -  InGroup<BlockCaptureAutoReleasing>, DefaultIgnore;
>> +  InGroup<BlockCaptureAutoReleasing>;
>>  def note_declare_parameter_autoreleasing : Note<
>>    "declare the parameter __autoreleasing explicitly to suppress this 
>> warning">;
>>  def note_declare_parameter_strong : Note<
>> 
>> Modified: cfe/trunk/test/SemaObjC/arc.m
>> URL: 
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc.m?rev=293199&r1=293198&r2=293199&view=diff
>>  
>> <http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/arc.m?rev=293199&r1=293198&r2=293199&view=diff>
>> ==============================================================================
>> --- cfe/trunk/test/SemaObjC/arc.m (original)
>> +++ cfe/trunk/test/SemaObjC/arc.m Thu Jan 26 12:51:10 2017
>> @@ -1,4 +1,4 @@
>> -// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak 
>> -fsyntax-only -fobjc-arc -fblocks -verify -Wno-objc-root-class 
>> -Wblock-capture-autoreleasing %s
>> +// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fobjc-runtime-has-weak 
>> -fsyntax-only -fobjc-arc -fblocks -verify -Wno-objc-root-class %s
>> 
>>  typedef unsigned long NSUInteger;
>>  typedef const void * CFTypeRef;
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits 
>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
>> 
> 
> 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to