Author: xazax Date: Mon Oct 30 10:06:42 2017 New Revision: 316924 URL: http://llvm.org/viewvc/llvm-project?rev=316924&view=rev Log: [analyzer] Left shifting a negative value is undefined
The analyzer did not return an UndefVal in case a negative value was left shifted. I also altered the UndefResultChecker to emit a clear warning in this case. Differential Revision: https://reviews.llvm.org/D39423 Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp cfe/trunk/lib/StaticAnalyzer/Core/BasicValueFactory.cpp cfe/trunk/test/Analysis/bitwise-ops.c Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp?rev=316924&r1=316923&r2=316924&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp Mon Oct 30 10:06:42 2017 @@ -137,6 +137,10 @@ void UndefResultChecker::checkPostStmt(c OS << " greater or equal to the width of type '" << B->getLHS()->getType().getAsString() << "'."; + } else if (B->getOpcode() == BinaryOperatorKind::BO_Shl && + C.isNegative(B->getLHS())) { + OS << "The result of the left shift is undefined because the left " + "operand is negative"; } else { OS << "The result of the '" << BinaryOperator::getOpcodeStr(B->getOpcode()) Modified: cfe/trunk/lib/StaticAnalyzer/Core/BasicValueFactory.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BasicValueFactory.cpp?rev=316924&r1=316923&r2=316924&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/BasicValueFactory.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/BasicValueFactory.cpp Mon Oct 30 10:06:42 2017 @@ -225,6 +225,8 @@ BasicValueFactory::evalAPSInt(BinaryOper // test these conditions symbolically. // FIXME: Expand these checks to include all undefined behavior. + if (V1.isSigned() && V1.isNegative()) + return nullptr; if (V2.isSigned() && V2.isNegative()) return nullptr; Modified: cfe/trunk/test/Analysis/bitwise-ops.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/bitwise-ops.c?rev=316924&r1=316923&r2=316924&view=diff ============================================================================== --- cfe/trunk/test/Analysis/bitwise-ops.c (original) +++ cfe/trunk/test/Analysis/bitwise-ops.c Mon Oct 30 10:06:42 2017 @@ -44,3 +44,10 @@ int testNegativeShift(int a) { } return 0; } + +int testNegativeLeftShift(int a) { + if (a == -3) { + return a << 1; // expected-warning{{The result of the left shift is undefined because the left operand is negative}} + } + return 0; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits