blob: 8b56f2cdc4ac2d5a43686e11545155a675f34136 [file] [log] [blame]
George Karpenkovead01622017-10-11 18:39:40 +00001// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s
2
3// Nullability of const string-like globals, testing
4// NonnullStringConstantsChecker.
5
6void clang_analyzer_eval(bool);
7
8@class NSString;
9typedef const struct __CFString *CFStringRef;
10
11// Global NSString* is non-null.
12extern NSString *const StringConstGlobal;
13void stringConstGlobal() {
14 clang_analyzer_eval(StringConstGlobal); // expected-warning{{TRUE}}
15}
16
17// The logic does not apply to local variables though.
18extern NSString *stringGetter();
19void stringConstLocal() {
20 NSString *const local = stringGetter();
21 clang_analyzer_eval(local); // expected-warning{{UNKNOWN}}
22}
23
24// Global const CFStringRef's are also assumed to be non-null.
25extern const CFStringRef CFStringConstGlobal;
26void cfStringCheckGlobal() {
27 clang_analyzer_eval(CFStringConstGlobal); // expected-warning{{TRUE}}
28}
29
30// But only "const" ones.
31extern CFStringRef CFStringNonConstGlobal;
32void cfStringCheckMutableGlobal() {
33 clang_analyzer_eval(CFStringNonConstGlobal); // expected-warning{{UNKNOWN}}
34}
35
36// char* const is also assumed to be non-null.
37extern const char *const ConstCharStarConst;
38void constCharStarCheckGlobal() {
39 clang_analyzer_eval(ConstCharStarConst); // expected-warning{{TRUE}}
40}
41
42// Pointer value can be mutable.
43extern char *const CharStarConst;
44void charStarCheckGlobal() {
45 clang_analyzer_eval(CharStarConst); // expected-warning{{TRUE}}
46}
47
48// But the pointer itself should be immutable.
49extern char *CharStar;
50void charStartCheckMutableGlobal() {
51 clang_analyzer_eval(CharStar); // expected-warning{{UNKNOWN}}
52}
53
54// Type definitions should also work across typedefs, for pointers:
55typedef char *const str;
56extern str globalStr;
57void charStarCheckTypedef() {
58 clang_analyzer_eval(globalStr); // expected-warning{{TRUE}}
59}
60
61// And for types.
62typedef NSString *const NStr;
63extern NStr globalNSString;
64void NSStringCheckTypedef() {
65 clang_analyzer_eval(globalNSString); // expected-warning{{TRUE}}
66}
67
68// Note that constness could be either inside
69// the var declaration, or in a typedef.
70typedef NSString *NStr2;
71extern const NStr2 globalNSString2;
72void NSStringCheckConstTypedef() {
73 clang_analyzer_eval(globalNSString2); // expected-warning{{TRUE}}
74}
75
76// Nested typedefs should work as well.
77typedef const CFStringRef str1;
78typedef str1 str2;
79extern str2 globalStr2;
80void testNestedTypedefs() {
81 clang_analyzer_eval(globalStr2); // expected-warning{{TRUE}}
82}
83
84// And for NSString *.
85typedef NSString *const nstr1;
86typedef nstr1 nstr2;
87extern nstr2 nglobalStr2;
88void testNestedTypedefsForNSString() {
89 clang_analyzer_eval(nglobalStr2); // expected-warning{{TRUE}}
90}