From 306a0a9182ea3627f5c5d8fa1eb1f1d239fd2799 Mon Sep 17 00:00:00 2001 From: Dulma Churchill Date: Thu, 30 Nov 2017 11:55:28 -0800 Subject: [PATCH] [liveness] Do not report on variables with block attribute Reviewed By: sblackshear Differential Revision: D6408338 fbshipit-source-id: 0fac3be --- infer/src/checkers/liveness.ml | 2 +- .../objc/liveness/ObserverExample.m | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 infer/tests/codetoanalyze/objc/liveness/ObserverExample.m diff --git a/infer/src/checkers/liveness.ml b/infer/src/checkers/liveness.ml index 3aa20a520..6a1369b6a 100644 --- a/infer/src/checkers/liveness.ml +++ b/infer/src/checkers/liveness.ml @@ -126,7 +126,7 @@ let checker {Callbacks.tenv; summary; proc_desc} : Specs.summary = not ( Pvar.is_frontend_tmp pvar || Pvar.is_return pvar || Pvar.is_global pvar || Domain.mem (Var.of_pvar pvar) live_vars || Procdesc.is_captured_var proc_desc pvar - || is_scope_guard typ ) + || is_scope_guard typ || Procdesc.has_modify_in_block_attr proc_desc pvar ) in let log_report pvar loc = let issue_id = IssueType.dead_store.unique_id in diff --git a/infer/tests/codetoanalyze/objc/liveness/ObserverExample.m b/infer/tests/codetoanalyze/objc/liveness/ObserverExample.m new file mode 100644 index 000000000..40c1d5c5c --- /dev/null +++ b/infer/tests/codetoanalyze/objc/liveness/ObserverExample.m @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2014 - 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 + +@interface ObervserExample : NSObject + +@end + +@implementation ObervserExample + +- (void)observer_no_dead_store:(id)object { + __block id observer = [[NSNotificationCenter defaultCenter] + addObserverForName:nil + object:object + queue:nil + usingBlock:^(NSNotification* note) { + [[NSNotificationCenter defaultCenter] removeObserver:observer + name:nil + object:nil]; + }]; +} + +@end