Author: Vince Bridgers Date: 2022-03-29T17:08:19-05:00 New Revision: fe8b2236ef9cf873875135dcc41364911898698d
URL: https://github.com/llvm/llvm-project/commit/fe8b2236ef9cf873875135dcc41364911898698d DIFF: https://github.com/llvm/llvm-project/commit/fe8b2236ef9cf873875135dcc41364911898698d.diff LOG: [analyzer] Fix "RhsLoc and LhsLoc bitwidth must be same" clang: <root>/clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp:727: void assertEqualBitWidths(clang::ento::ProgramStateRef, clang::ento::Loc, clang::ento::Loc): Assertion `RhsBitwidth == LhsBitwidth && "RhsLoc and LhsLoc bitwidth must be same!"' This change adjusts the bitwidth of the smaller operand for an evalBinOp as a result of a comparison operation. This can occur in the specific case represented by the test cases for a target with different pointer sizes. Reviewed By: NoQ Differential Revision: https://reviews.llvm.org/D122513 Added: clang/test/Analysis/addrspace-null.c Modified: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp index e9a1ec3173a94..e045c9a91e60c 100644 --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -682,8 +682,11 @@ SVal SValBuilder::evalCastSubKind(loc::ConcreteInt V, QualType CastTy, } // Pointer to any pointer. - if (Loc::isLocType(CastTy)) - return V; + if (Loc::isLocType(CastTy)) { + llvm::APSInt Value = V.getValue(); + BasicVals.getAPSIntType(CastTy).apply(Value); + return loc::ConcreteInt(BasicVals.getValue(Value)); + } // Pointer to whatever else. return UnknownVal(); diff --git a/clang/test/Analysis/addrspace-null.c b/clang/test/Analysis/addrspace-null.c new file mode 100644 index 0000000000000..54d96b277db04 --- /dev/null +++ b/clang/test/Analysis/addrspace-null.c @@ -0,0 +1,47 @@ +// RUN: %clang_analyze_cc1 -triple amdgcn-unknown-unknown \ +// RUN: -analyze -analyzer-checker=core -DAMDGCN_TRIPLE \ +// RUN: -analyze -analyzer-checker=debug.ExprInspection \ +// RUN: -Wno-implicit-int -Wno-int-conversion -verify %s +// +// RUN: %clang_analyze_cc1 -triple amdgcn-unknown-unknown \ +// RUN: -analyze -analyzer-checker=core -DDEFAULT_TRIPLE \ +// RUN: -analyze -analyzer-checker=debug.ExprInspection \ +// RUN: -Wno-implicit-int -Wno-int-conversion -verify %s + +// From https://llvm.org/docs/AMDGPUUsage.html#address-spaces, +// select address space 3 (local), since the pointer size is +// diff erent than Generic. + +// expected-no-diagnostics + +#define DEVICE __attribute__((address_space(3))) + +#if defined(AMDGCN_TRIPLE) +// this crashes +int fn1() { + int val = 0; + DEVICE int *dptr = val; + return dptr == (void *)0; +} + +// does not crash +int fn2() { + int val = 0; + DEVICE int *dptr = val; + return dptr == (DEVICE void *)0; +} + +// this crashes +int fn3() { + int val = 0; + int *dptr = val; + return dptr == (DEVICE void *)0; +} +#endif + +// does not crash +int fn4() { + int val = 0; + int *dptr = val; + return dptr == (void *)0; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits