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

68 lines
1.8 KiB
C++

// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=alpha.clone.CloneChecker -analyzer-config alpha.clone.CloneChecker:MinimumCloneComplexity=10 -verify %s
// Tests that macros and non-macro clones aren't mixed into the same hash
// group. This is currently necessary as all clones in a hash group need
// to have the same complexity value. Macros have smaller complexity values
// and need to be in their own hash group.
int foo(int a) { // expected-warning{{Duplicate code detected}}
a = a + 1;
a = a + 1 / 1;
a = a + 1 + 1 + 1;
a = a + 1 - 1 + 1 + 1;
a = a + 1 * 1 + 1 + 1 + 1;
a = a + 1 / 1 + 1 + 1 + 1;
return a;
}
int fooClone(int a) { // expected-note{{Similar code here}}
a = a + 1;
a = a + 1 / 1;
a = a + 1 + 1 + 1;
a = a + 1 - 1 + 1 + 1;
a = a + 1 * 1 + 1 + 1 + 1;
a = a + 1 / 1 + 1 + 1 + 1;
return a;
}
// Below is the same AST as above but this time generated with macros. The
// clones below should land in their own hash group for the reasons given above.
#define ASSIGN(T, V) T = T + V
int macro(int a) { // expected-warning{{Duplicate code detected}}
ASSIGN(a, 1);
ASSIGN(a, 1 / 1);
ASSIGN(a, 1 + 1 + 1);
ASSIGN(a, 1 - 1 + 1 + 1);
ASSIGN(a, 1 * 1 + 1 + 1 + 1);
ASSIGN(a, 1 / 1 + 1 + 1 + 1);
return a;
}
int macroClone(int a) { // expected-note{{Similar code here}}
ASSIGN(a, 1);
ASSIGN(a, 1 / 1);
ASSIGN(a, 1 + 1 + 1);
ASSIGN(a, 1 - 1 + 1 + 1);
ASSIGN(a, 1 * 1 + 1 + 1 + 1);
ASSIGN(a, 1 / 1 + 1 + 1 + 1);
return a;
}
// FIXME: Macros with empty definitions in the AST are currently ignored.
#define EMPTY
int fooFalsePositiveClone(int a) { // expected-note{{Similar code here}}
a = EMPTY a + 1;
a = a + 1 / 1;
a = a + 1 + 1 + 1;
a = a + 1 - 1 + 1 + 1;
a = a + 1 * 1 + 1 + 1 + 1;
a = a + 1 / 1 + 1 + 1 + 1;
return a;
}