198 lines · plain
1// Temporarily disabling the test, it failes the "system is over-constrained" (part of expensive checks)2// assertion in *non* optimized builds.3// REQUIRES: rdar449921704// RUN: %clang_analyze_cc1 -fblocks -analyzer-checker=core,nullability,apiModeling,debug.ExprInspection -verify %s5 6#include "Inputs/system-header-simulator-for-nullability.h"7 8void clang_analyzer_warnIfReached(void);9 10NSString* _Nonnull trust_nonnull_framework_annotation(void) {11 NSString* out = [NSString generateString];12 if (out) {}13 return out; // no-warning14}15 16NSString* _Nonnull trust_instancemsg_annotation(NSString* _Nonnull param) {17 NSString* out = [param stringByAppendingString:@"string"];18 if (out) {}19 return out; // no-warning20}21 22NSString* _Nonnull distrust_instancemsg_noannotation(NSString* param) {23 if (param) {}24 NSString* out = [param stringByAppendingString:@"string"];25 if (out) {}26 return out; // expected-warning{{}}27}28 29NSString* _Nonnull trust_analyzer_knowledge(NSString* param) {30 if (!param)31 return @"";32 NSString* out = [param stringByAppendingString:@"string"];33 if (out) {}34 return out; // no-warning35}36 37NSString* _Nonnull trust_assume_nonnull_macro(void) {38 NSString* out = [NSString generateImplicitlyNonnullString];39 if (out) {}40 return out; // no-warning41}42 43NSString* _Nonnull distrust_without_annotation(void) {44 NSString* out = [NSString generatePossiblyNullString];45 if (out) {}46 return out; // expected-warning{{}}47}48 49NSString* _Nonnull nonnull_please_trust_me(void);50 51NSString* _Nonnull distrust_local_nonnull_annotation(void) {52 NSString* out = nonnull_please_trust_me();53 if (out) {}54 return out; // expected-warning{{}}55}56 57NSString* _Nonnull trust_c_function(void) {58 NSString* out = getString();59 if (out) {};60 return out; // no-warning61}62 63NSString* _Nonnull distrust_unannoted_function(void) {64 NSString* out = getPossiblyNullString();65 if (out) {};66 return out; // expected-warning{{}}67}68 69NSString * _Nonnull distrustProtocol(id<MyProtocol> o) {70 NSString* out = [o getString];71 if (out) {};72 return out; // expected-warning{{}}73}74 75// If the return value is non-nil, the index is non-nil.76NSString *_Nonnull retImpliesIndex(NSString *s,77 NSDictionary *dic) {78 id obj = dic[s];79 if (s) {}80 if (obj)81 return s; // no-warning82 return @"foo";83}84 85NSString *_Nonnull retImpliesIndexOtherMethod(NSString *s,86 NSDictionary *dic) {87 id obj = [dic objectForKey:s];88 if (s) {}89 if (obj)90 return s; // no-warning91 return @"foo";92}93 94NSString *_Nonnull retImpliesIndexOnRHS(NSString *s,95 NSDictionary *dic) {96 id obj = dic[s];97 if (s) {}98 if (nil != obj)99 return s; // no-warning100 return @"foo";101}102 103NSString *_Nonnull retImpliesIndexReverseCheck(NSString *s,104 NSDictionary *dic) {105 id obj = dic[s];106 if (s) {}107 if (!obj)108 return @"foo";109 return s; // no-warning110}111 112NSString *_Nonnull retImpliesIndexReverseCheckOnRHS(NSString *s,113 NSDictionary *dic) {114 id obj = dic[s];115 if (s) {}116 if (nil == obj)117 return @"foo";118 return s; // no-warning119}120 121NSString *_Nonnull retImpliesIndexWrongBranch(NSString *s,122 NSDictionary *dic) {123 id obj = dic[s];124 if (s) {}125 if (!obj)126 return s; // expected-warning{{}}127 return @"foo";128}129 130NSString *_Nonnull retImpliesIndexWrongBranchOnRHS(NSString *s,131 NSDictionary *dic) {132 id obj = dic[s];133 if (s) {}134 if (nil == obj)135 return s; // expected-warning{{}}136 return @"foo";137}138 139// The return value could still be nil for a non-nil index.140NSDictionary *_Nonnull indexDoesNotImplyRet(NSString *s,141 NSDictionary *dic) {142 id obj = dic[s];143 if (obj) {}144 if (s)145 return obj; // expected-warning{{}}146 return [[NSDictionary alloc] init];147}148 149// The return value could still be nil for a non-nil index.150NSDictionary *_Nonnull notIndexImpliesNotRet(NSString *s,151 NSDictionary *dic) {152 id obj = dic[s];153 if (!s) {154 if (obj != nil) {155 clang_analyzer_warnIfReached(); // no-warning156 }157 }158 return [[NSDictionary alloc] init];159}160 161NSString *_Nonnull checkAssumeOnMutableDictionary(NSMutableDictionary *d,162 NSString *k,163 NSString *val) {164 d[k] = val;165 if (k) {}166 return k; // no-warning167}168 169NSString *_Nonnull checkAssumeOnMutableDictionaryOtherMethod(NSMutableDictionary *d,170 NSString *k,171 NSString *val) {172 [d setObject:val forKey:k];173 if (k) {}174 return k; // no-warning175}176 177// Check that we don't crash when the added assumption is enough178// to make the state unfeasible.179@class DummyClass;180@interface DictionarySubclass : NSDictionary {181 DummyClass *g;182 DictionarySubclass *d;183}184@end185@implementation DictionarySubclass186- (id) objectForKey:(id)e {187 if (e) {}188 return d;189}190- (void) coder {191 for (id e in g) {192 id f = [self objectForKey:e];193 if (f)194 (void)e;195 }196}197@end198