1 // RUN: %check_clang_tidy %s bugprone-suspicious-string-compare %t -- \
2 // RUN: -config='{CheckOptions: \
3 // RUN: [{key: bugprone-suspicious-string-compare.WarnOnImplicitComparison, value: 1}, \
4 // RUN: {key: bugprone-suspicious-string-compare.WarnOnLogicalNotComparison, value: 1}]}' \
5 // RUN: -- -std=c99
6
7 static const char A[] = "abc";
8
9 int strcmp(const char *, const char *);
10
test_warning_patterns()11 int test_warning_patterns() {
12 if (strcmp(A, "a"))
13 return 0;
14 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is called without explicitly comparing result [bugprone-suspicious-string-compare]
15 // CHECK-FIXES: if (strcmp(A, "a") != 0)
16
17 if (strcmp(A, "a") != 0 ||
18 strcmp(A, "b"))
19 return 0;
20 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is called without explicitly comparing result
21 // CHECK-FIXES: strcmp(A, "b") != 0)
22
23 if (strcmp(A, "a") == 1)
24 return 0;
25 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is compared to a suspicious constant
26
27 if (strcmp(A, "a") == -1)
28 return 0;
29 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is compared to a suspicious constant
30
31 if (strcmp(A, "a") < '0')
32 return 0;
33 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is compared to a suspicious constant
34
35 if (strcmp(A, "a") < 0.)
36 return 0;
37 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' has suspicious implicit cast
38
39 if (!strcmp(A, "a"))
40 return 0;
41 // CHECK-MESSAGES: [[@LINE-2]]:8: warning: function 'strcmp' is compared using logical not operator
42 // CHECK-FIXES: if (strcmp(A, "a") == 0)
43 }
44
test_structure_patterns()45 void test_structure_patterns() {
46 if (strcmp(A, "a")) {}
47 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: function 'strcmp' is called without explicitly comparing result
48 // CHECK-FIXES: if (strcmp(A, "a") != 0) {}
49
50 while (strcmp(A, "a")) {}
51 // CHECK-MESSAGES: [[@LINE-1]]:10: warning: function 'strcmp' is called without explicitly comparing result
52 // CHECK-FIXES: while (strcmp(A, "a") != 0) {}
53
54 for (;strcmp(A, "a");) {}
55 // CHECK-MESSAGES: [[@LINE-1]]:9: warning: function 'strcmp' is called without explicitly comparing result
56 // CHECK-FIXES: for (;strcmp(A, "a") != 0;) {}
57 }
58
test_valid_patterns()59 int test_valid_patterns() {
60 // The following cases are valid.
61 if (strcmp(A, "a") < 0) return 0;
62 if (strcmp(A, "a") == 0) return 0;
63 if (strcmp(A, "a") <= 0) return 0;
64 if (strcmp(A, "a") == strcmp(A, "b")) return 0;
65 return 1;
66 }
67
wrapper(const char * a,const char * b)68 int wrapper(const char* a, const char* b) {
69 return strcmp(a, b);
70 }
71
assignment_wrapper(const char * a,const char * b)72 int assignment_wrapper(const char* a, const char* b) {
73 int cmp = strcmp(a, b);
74 return cmp;
75 }
76
condexpr_wrapper(const char * a,const char * b)77 int condexpr_wrapper(const char* a, const char* b) {
78 return (a < b) ? strcmp(a, b) : strcmp(b, a);
79 }
80