80 lines · c
1// RUN: %check_clang_tidy %s bugprone-suspicious-string-compare %t -- \2// RUN: -config='{CheckOptions: \3// RUN: {bugprone-suspicious-string-compare.WarnOnImplicitComparison: true, \4// RUN: bugprone-suspicious-string-compare.WarnOnLogicalNotComparison: true}}' \5// RUN: -- -std=c996 7static const char A[] = "abc";8 9int strcmp(const char *, const char *);10 11int test_warning_patterns(void) {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 result21 // 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 constant26 27 if (strcmp(A, "a") == -1)28 return 0;29 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is compared to a suspicious constant30 31 if (strcmp(A, "a") < '0')32 return 0;33 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' is compared to a suspicious constant34 35 if (strcmp(A, "a") < 0.)36 return 0;37 // CHECK-MESSAGES: [[@LINE-2]]:7: warning: function 'strcmp' has suspicious implicit cast38 39 if (!strcmp(A, "a"))40 return 0;41 // CHECK-MESSAGES: [[@LINE-2]]:8: warning: function 'strcmp' is compared using logical not operator42 // CHECK-FIXES: if (strcmp(A, "a") == 0)43}44 45void test_structure_patterns(void) {46 if (strcmp(A, "a")) {}47 // CHECK-MESSAGES: [[@LINE-1]]:7: warning: function 'strcmp' is called without explicitly comparing result48 // 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 result52 // 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 result56 // CHECK-FIXES: for (;strcmp(A, "a") != 0;) {}57}58 59int test_valid_patterns(void) {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 68int wrapper(const char* a, const char* b) {69 return strcmp(a, b);70}71 72int assignment_wrapper(const char* a, const char* b) {73 int cmp = strcmp(a, b);74 return cmp;75}76 77int condexpr_wrapper(const char* a, const char* b) {78 return (a < b) ? strcmp(a, b) : strcmp(b, a);79}80