1 // RUN: %clang_analyze_cc1 -analyzer-output=plist -analyzer-config notes-as-events=true -o %t.plist -std=c++11 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s 2 // RUN: FileCheck --input-file=%t.plist %s 3 4 void log(); 5 6 int max(int a, int b) { // expected-warning{{Duplicate code detected}} 7 log(); 8 if (a > b) 9 return a; 10 return b; 11 } 12 13 int maxClone(int a, int b) { // no-note (converted into event) 14 log(); 15 if (a > b) 16 return a; 17 return b; 18 } 19 20 // CHECK: <key>diagnostics</key> 21 // CHECK-NEXT: <array> 22 // CHECK-NEXT: <dict> 23 // CHECK-NEXT: <key>path</key> 24 // CHECK-NEXT: <array> 25 // CHECK-NEXT: <dict> 26 // CHECK-NEXT: <key>kind</key><string>event</string> 27 // CHECK-NEXT: <key>location</key> 28 // CHECK-NEXT: <dict> 29 // CHECK-NEXT: <key>line</key><integer>13</integer> 30 // CHECK-NEXT: <key>col</key><integer>28</integer> 31 // CHECK-NEXT: <key>file</key><integer>0</integer> 32 // CHECK-NEXT: </dict> 33 // CHECK-NEXT: <key>ranges</key> 34 // CHECK-NEXT: <array> 35 // CHECK-NEXT: <array> 36 // CHECK-NEXT: <dict> 37 // CHECK-NEXT: <key>line</key><integer>13</integer> 38 // CHECK-NEXT: <key>col</key><integer>28</integer> 39 // CHECK-NEXT: <key>file</key><integer>0</integer> 40 // CHECK-NEXT: </dict> 41 // CHECK-NEXT: <dict> 42 // CHECK-NEXT: <key>line</key><integer>18</integer> 43 // CHECK-NEXT: <key>col</key><integer>1</integer> 44 // CHECK-NEXT: <key>file</key><integer>0</integer> 45 // CHECK-NEXT: </dict> 46 // CHECK-NEXT: </array> 47 // CHECK-NEXT: </array> 48 // CHECK-NEXT: <key>depth</key><integer>0</integer> 49 // CHECK-NEXT: <key>extended_message</key> 50 // CHECK-NEXT: <string>Similar code here</string> 51 // CHECK-NEXT: <key>message</key> 52 // CHECK-NEXT: <string>Similar code here</string> 53 // CHECK-NEXT: </dict> 54 // CHECK-NEXT: <dict> 55 // CHECK-NEXT: <key>kind</key><string>event</string> 56 // CHECK-NEXT: <key>location</key> 57 // CHECK-NEXT: <dict> 58 // CHECK-NEXT: <key>line</key><integer>6</integer> 59 // CHECK-NEXT: <key>col</key><integer>23</integer> 60 // CHECK-NEXT: <key>file</key><integer>0</integer> 61 // CHECK-NEXT: </dict> 62 // CHECK-NEXT: <key>ranges</key> 63 // CHECK-NEXT: <array> 64 // CHECK-NEXT: <array> 65 // CHECK-NEXT: <dict> 66 // CHECK-NEXT: <key>line</key><integer>6</integer> 67 // CHECK-NEXT: <key>col</key><integer>23</integer> 68 // CHECK-NEXT: <key>file</key><integer>0</integer> 69 // CHECK-NEXT: </dict> 70 // CHECK-NEXT: <dict> 71 // CHECK-NEXT: <key>line</key><integer>11</integer> 72 // CHECK-NEXT: <key>col</key><integer>1</integer> 73 // CHECK-NEXT: <key>file</key><integer>0</integer> 74 // CHECK-NEXT: </dict> 75 // CHECK-NEXT: </array> 76 // CHECK-NEXT: </array> 77 // CHECK-NEXT: <key>depth</key><integer>0</integer> 78 // CHECK-NEXT: <key>extended_message</key> 79 // CHECK-NEXT: <string>Duplicate code detected</string> 80 // CHECK-NEXT: <key>message</key> 81 // CHECK-NEXT: <string>Duplicate code detected</string> 82 // CHECK-NEXT: </dict> 83 // CHECK-NEXT: </array> 84 // CHECK-NEXT: <key>description</key><string>Duplicate code detected</string> 85 // CHECK-NEXT: <key>category</key><string>Code clone</string> 86 // CHECK-NEXT: <key>type</key><string>Exact code clone</string> 87 // CHECK-NEXT: <key>check_name</key><string>alpha.clone.CloneChecker</string> 88 // CHECK-NEXT: <!-- This hash is experimental and going to change! --> 89 // CHECK-NEXT: <key>issue_hash_content_of_line_in_context</key><string>3d15184f38c5fa57e479b744fe3f5035</string> 90 // CHECK-NEXT: <key>location</key> 91 // CHECK-NEXT: <dict> 92 // CHECK-NEXT: <key>line</key><integer>6</integer> 93 // CHECK-NEXT: <key>col</key><integer>23</integer> 94 // CHECK-NEXT: <key>file</key><integer>0</integer> 95 // CHECK-NEXT: </dict> 96 // CHECK-NEXT: </dict> 97 // CHECK-NEXT: </array> 98