vabridgers updated this revision to Diff 418749. vabridgers added a comment.
Come up with a more principaled fix, thanks @NoQ :) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D122513/new/ https://reviews.llvm.org/D122513 Files: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp clang/test/Analysis/addrspace-null.c Index: clang/test/Analysis/addrspace-null.c =================================================================== --- /dev/null +++ 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 +// different than Generic. + +// expected-no-diagnostics + +#define DEVICE __attribute__((address_space(3))) + +#if defined(AMDGCN) +// 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; +} Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -682,8 +682,11 @@ } // 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();
Index: clang/test/Analysis/addrspace-null.c =================================================================== --- /dev/null +++ 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 +// different than Generic. + +// expected-no-diagnostics + +#define DEVICE __attribute__((address_space(3))) + +#if defined(AMDGCN) +// 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; +} Index: clang/lib/StaticAnalyzer/Core/SValBuilder.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -682,8 +682,11 @@ } // 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();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits