Author: pgousseau Date: Tue Jan 12 04:40:45 2016 New Revision: 257467 URL: http://llvm.org/viewvc/llvm-project?rev=257467&view=rev Log: [analyzer] Fix RangeConstraintManager's pinning of single value ranges.
This fix a bug in RangeSet::pin causing single value ranges to be considered non conventionally ordered. Differential Revision: http://reviews.llvm.org/D12901 Modified: cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp cfe/trunk/test/Analysis/range_casts.c Modified: cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp?rev=257467&r1=257466&r2=257467&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp Tue Jan 12 04:40:45 2016 @@ -171,7 +171,7 @@ private: case APSIntType::RTR_Below: // The entire range is outside the symbol's set of possible values. // If this is a conventionally-ordered range, the state is infeasible. - if (Lower < Upper) + if (Lower <= Upper) return false; // However, if the range wraps around, it spans all possible values. @@ -222,7 +222,7 @@ private: case APSIntType::RTR_Above: // The entire range is outside the symbol's set of possible values. // If this is a conventionally-ordered range, the state is infeasible. - if (Lower < Upper) + if (Lower <= Upper) return false; // However, if the range wraps around, it spans all possible values. Modified: cfe/trunk/test/Analysis/range_casts.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/range_casts.c?rev=257467&r1=257466&r2=257467&view=diff ============================================================================== --- cfe/trunk/test/Analysis/range_casts.c (original) +++ cfe/trunk/test/Analysis/range_casts.c Tue Jan 12 04:40:45 2016 @@ -73,6 +73,16 @@ void f7(long foo) clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} } +void f8(long foo) +{ + unsigned index = -1; + if (index < foo) index = foo; + if (index + 1L == 0L) + clang_analyzer_warnIfReached(); // no-warning + else + clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} +} + void f9(long foo) { unsigned index = -1; @@ -93,6 +103,16 @@ void f10(long foo) clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} } +void f11(long foo) +{ + unsigned index = -1; + if (index < foo) index = foo; + if (index + 1UL == 0L) + clang_analyzer_warnIfReached(); // no-warning + else + clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} +} + void f12(long foo) { unsigned index = -1; @@ -102,6 +122,16 @@ void f12(long foo) else clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} } + +void f13(int foo) +{ + unsigned short index = -1; + if (index < foo) index = foo; + if (index + 1 == 0) + clang_analyzer_warnIfReached(); // no-warning + else + clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} +} void f14(long foo) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits