r340474 - [analyzer] Track the problematic subexpression in UndefResultChecker

George Karpenkov via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 22 16:17:02 PDT 2018


Author: george.karpenkov
Date: Wed Aug 22 16:17:02 2018
New Revision: 340474

URL: http://llvm.org/viewvc/llvm-project?rev=340474&view=rev
Log:
[analyzer] Track the problematic subexpression in UndefResultChecker

This is tested in a subsequent commit, which allows tracking those values.

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

Modified:
    cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp

Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp?rev=340474&r1=340473&r2=340474&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/UndefResultChecker.cpp Wed Aug 22 16:17:02 2018
@@ -122,6 +122,7 @@ void UndefResultChecker::checkPostStmt(c
            << ((B->getOpcode() == BinaryOperatorKind::BO_Shl) ? "left"
                                                               : "right")
            << " shift is undefined because the right operand is negative";
+        Ex = B->getRHS();
       } else if ((B->getOpcode() == BinaryOperatorKind::BO_Shl ||
                   B->getOpcode() == BinaryOperatorKind::BO_Shr) &&
                  isShiftOverflow(B, C)) {
@@ -130,6 +131,7 @@ void UndefResultChecker::checkPostStmt(c
            << ((B->getOpcode() == BinaryOperatorKind::BO_Shl) ? "left"
                                                               : "right")
            << " shift is undefined due to shifting by ";
+        Ex = B->getRHS();
 
         SValBuilder &SB = C.getSValBuilder();
         const llvm::APSInt *I =
@@ -147,6 +149,7 @@ void UndefResultChecker::checkPostStmt(c
                  C.isNegative(B->getLHS())) {
         OS << "The result of the left shift is undefined because the left "
               "operand is negative";
+        Ex = B->getLHS();
       } else if (B->getOpcode() == BinaryOperatorKind::BO_Shl &&
                  isLeftShiftResultUnrepresentable(B, C)) {
         ProgramStateRef State = C.getState();
@@ -160,6 +163,7 @@ void UndefResultChecker::checkPostStmt(c
            << "\', which is unrepresentable in the unsigned version of "
            << "the return type \'" << B->getLHS()->getType().getAsString()
            << "\'";
+        Ex = B->getLHS();
       } else {
         OS << "The result of the '"
            << BinaryOperator::getOpcodeStr(B->getOpcode())




More information about the cfe-commits mailing list