Raphael Isemann 561f0de6d9 [analyzer] Increase minimum complexity filter of the CloneChecker.
Summary:
So far we used a value of 10 which was useful for testing but produces many false-positives in real programs. The usual suspicious clones we find seem to be at around a complexity value of 70 and for normal clone-reporting everything above 50 seems to be a valid normal clone for users, so let's just go with 50 for now and set this as the new default value.

This patch also explicitly sets the complexity value for the regression tests as they serve more of a regression testing/debugging purpose and shouldn't really be reported by default in real programs. I'll add more tests that reflect actual found bugs that then need to pass with the default setting in the future.

Reviewers: NoQ

Subscribers: cfe-commits, javed.absar, xazax.hun, v.g.vassilev

Differential Revision: https://reviews.llvm.org/D34178

llvm-svn: 312468
2017-09-04 05:56:36 +00:00

59 lines
1.4 KiB
C++

// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
// This tests if we search for clones in functions.
void log();
int max(int a, int b) { // expected-warning{{Duplicate code detected}}
log();
if (a > b)
return a;
return b;
}
int maxClone(int x, int y) { // expected-note{{Similar code here}}
log();
if (x > y)
return x;
return y;
}
// Functions below are not clones and should not be reported.
// The next two functions test that statement classes are still respected when
// checking for clones in expressions. This will show that the statement
// specific data of all base classes is collected, and not just the data of the
// first base class.
int testBaseClass(int a, int b) { // no-warning
log();
if (a > b)
return true ? a : b;
return b;
}
int testBaseClass2(int a, int b) { // no-warning
log();
if (a > b)
return __builtin_choose_expr(true, a, b);
return b;
}
// No clone because of the different comparison operator.
int min1(int a, int b) { // no-warning
log();
if (a < b)
return a;
return b;
}
// No clone because of the different pattern in which the variables are used.
int min2(int a, int b) { // no-warning
log();
if (a > b)
return b;
return a;
}
int foo(int a, int b) { // no-warning
return a + b;
}