[retain cycles] Fix false positives to do with not finding weak attribute in the tenv

Reviewed By: mbouaziz

Differential Revision: D7067081

fbshipit-source-id: 2722867
master
Dulma Churchill 7 years ago committed by Facebook Github Bot
parent c34ff07375
commit 3cb56ea3c1

@ -63,11 +63,11 @@ let edge_is_strong tenv obj_edge =
let find fields = let find fields =
List.find ~f:equal_fn fields |> Option.value_map ~f:trd3 ~default:[] List.find ~f:equal_fn fields |> Option.value_map ~f:trd3 ~default:[]
in in
find fields @ find statics Some (find fields @ find statics)
| None -> | None ->
[] ) None )
| _ -> | _ ->
[] None
in in
let has_weak_or_unretained_or_assign params = let has_weak_or_unretained_or_assign params =
List.exists List.exists
@ -76,14 +76,18 @@ let edge_is_strong tenv obj_edge =
|| String.equal Config.assign att ) || String.equal Config.assign att )
params params
in in
let ia = get_item_annotation obj_edge.rc_from.rc_node_typ obj_edge.rc_field.rc_field_name in
let weak_edge = let weak_edge =
List.exists match get_item_annotation obj_edge.rc_from.rc_node_typ obj_edge.rc_field.rc_field_name with
~f:(fun ((ann: Annot.t), _) -> | Some ia ->
( String.equal ann.class_name Config.property_attributes List.exists
|| String.equal ann.class_name Config.ivar_attributes ) ~f:(fun ((ann: Annot.t), _) ->
&& has_weak_or_unretained_or_assign ann.parameters ) ( String.equal ann.class_name Config.property_attributes
ia || String.equal ann.class_name Config.ivar_attributes )
&& has_weak_or_unretained_or_assign ann.parameters )
ia
| None ->
true
(* Assume the edge is weak if the type cannot be found in the tenv, to avoid FPs *)
in in
not weak_edge not weak_edge

@ -0,0 +1,15 @@
/*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import "ViewController.h"
#import <Foundation/NSObject.h>
int main() {
ViewController* controller = [ViewController new];
return 0;
}

@ -0,0 +1,15 @@
/*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import <Foundation/NSObject.h>
@interface View : NSObject
@property(nonatomic, weak) id delegate;
@end

@ -0,0 +1,13 @@
/*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import "View.h"
@implementation View
@end

@ -0,0 +1,13 @@
/*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import <Foundation/NSObject.h>
@interface ViewController : NSObject
@end

@ -0,0 +1,24 @@
/*
* Copyright (c) 2018 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import "ViewController.h"
@implementation ViewController {
View* _hostingView;
}
- (instancetype)init {
if (self = [super init]) {
_hostingView = [[View alloc] init];
_hostingView.delegate = self;
}
return self;
}
@end

@ -0,0 +1,23 @@
# Copyright (c) 2017 - present Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD style license found in the
# LICENSE file in the root directory of this source tree. An additional grant
# of patent rights can be found in the PATENTS file in the same directory.
TESTS_DIR = ../..
ROOT_DIR = $(TESTS_DIR)/../..
CODETOANALYZE_DIR = ../codetoanalyze/objc_retain_cycles
ANALYZER = checkers
SOURCES = $(CODETOANALYZE_DIR)/View.m $(CODETOANALYZE_DIR)/ViewController.m $(CODETOANALYZE_DIR)/Caller.m
OBJECTS = $(CODETOANALYZE_DIR)/View.o $(CODETOANALYZE_DIR)/ViewController.o $(CODETOANALYZE_DIR)/Caller.o
INFER_OPTIONS = --biabduction-only --report-custom-error --developer-mode --project-root $(TESTS_DIR)
INFERPRINT_OPTIONS = --project-root $(TESTS_DIR) --issues-tests
include $(TESTS_DIR)/infer.make
infer-out/report.json: $(CLANG_DEPS) $(SOURCES) $(MAKEFILE_LIST)
$(QUIET)$(REMOVE_DIR) buck-out && \
$(call silent_on_success,Testing analysis with Objective-C getters and setters,\
$(INFER_BIN) $(INFER_OPTIONS) --results-dir $(CURDIR)/infer-out -- clang -c -fobjc-arc $(SOURCES))
Loading…
Cancel
Save