aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChih-Hung Hsieh <chh@google.com>2022-12-21 16:01:26 -0800
committerChih-Hung Hsieh <chh@google.com>2023-01-13 14:48:50 -0800
commit5cdd31147d450933389a0bc2c1b5648764acf506 (patch)
tree4850f24fbea0fbd80883d9e31a6a670997ec3ae8
parentf41b8fd5d6f637c434dc67b4eff0eaf21b5f4b4f (diff)
downloadlibbcc-5cdd31147d450933389a0bc2c1b5648764acf506.tar.gz
Fix/suppress potential nullptr dereference warnings.
These are probably all false positives if the dynamic_cast can never fail. Yet we need to help the static analyzer with the additional checks to suppress the warnings. It might not matter if we return false, or call abort or exit for those unreachable cases. Bug: 263274255 Test: presubmit; make tidy-frameworks-compile_subset Change-Id: Ie29a17672534ce0f64e2e6ccded6781a668449ac
-rw-r--r--lib/RSGlobalInfoPass.cpp20
-rw-r--r--lib/RSInvokeHelperPass.cpp4
-rw-r--r--lib/RSUtils.h3
-rw-r--r--lib/RSX86TranslateGEPPass.cpp1
4 files changed, 28 insertions, 0 deletions
diff --git a/lib/RSGlobalInfoPass.cpp b/lib/RSGlobalInfoPass.cpp
index 40d658b..d9e64f3 100644
--- a/lib/RSGlobalInfoPass.cpp
+++ b/lib/RSGlobalInfoPass.cpp
@@ -206,6 +206,10 @@ public:
llvm::Value *V = M.getOrInsertGlobal(kRsGlobalEntries, Int32Ty);
llvm::GlobalVariable *GlobalEntries =
llvm::dyn_cast<llvm::GlobalVariable>(V);
+ if (!GlobalEntries) {
+ // Abort when dynamic_cast failed?
+ return false;
+ }
llvm::Constant *GlobalEntriesInit =
llvm::ConstantInt::get(Int32Ty, NumGlobals);
GlobalEntries->setInitializer(GlobalEntriesInit);
@@ -215,6 +219,10 @@ public:
V = M.getOrInsertGlobal(kRsGlobalNames, VoidPtrArrayTy);
llvm::GlobalVariable *GlobalNames =
llvm::dyn_cast<llvm::GlobalVariable>(V);
+ if (!GlobalNames) {
+ // Abort when dynamic_cast failed?
+ return false;
+ }
llvm::Constant *GlobalNamesInit =
llvm::ConstantArray::get(VoidPtrArrayTy, GVNames);
GlobalNames->setInitializer(GlobalNamesInit);
@@ -224,6 +232,10 @@ public:
V = M.getOrInsertGlobal(kRsGlobalAddresses, VoidPtrArrayTy);
llvm::GlobalVariable *GlobalAddresses =
llvm::dyn_cast<llvm::GlobalVariable>(V);
+ if (!GlobalAddresses) {
+ // Abort when dynamic_cast failed?
+ return false;
+ }
llvm::Constant *GlobalAddressesInit =
llvm::ConstantArray::get(VoidPtrArrayTy, GVAddresses);
GlobalAddresses->setInitializer(GlobalAddressesInit);
@@ -234,6 +246,10 @@ public:
V = M.getOrInsertGlobal(kRsGlobalSizes, SizeArrayTy);
llvm::GlobalVariable *GlobalSizes =
llvm::dyn_cast<llvm::GlobalVariable>(V);
+ if (!GlobalSizes) {
+ // Abort when dynamic_cast failed?
+ return false;
+ }
llvm::Constant *GlobalSizesInit;
if (PointerSizeInBits == 32) {
GlobalSizesInit = llvm::ConstantDataArray::get(M.getContext(), GVSizes32);
@@ -247,6 +263,10 @@ public:
V = M.getOrInsertGlobal(kRsGlobalProperties, Int32ArrayTy);
llvm::GlobalVariable *GlobalProperties =
llvm::dyn_cast<llvm::GlobalVariable>(V);
+ if (!GlobalProperties) {
+ // Abort when dynamic_cast failed?
+ return false;
+ }
llvm::Constant *GlobalPropertiesInit =
llvm::ConstantDataArray::get(M.getContext(), GVProperties);
GlobalProperties->setInitializer(GlobalPropertiesInit);
diff --git a/lib/RSInvokeHelperPass.cpp b/lib/RSInvokeHelperPass.cpp
index 99316ce..a22909f 100644
--- a/lib/RSInvokeHelperPass.cpp
+++ b/lib/RSInvokeHelperPass.cpp
@@ -177,6 +177,10 @@ public:
continue;
llvm::StructType *argStructType = llvm::dyn_cast<llvm::StructType>(argType->getPointerElementType());
+ if (!argStructType) {
+ // Abort when dynamic_cast failed?
+ continue;
+ }
for (unsigned int i = 0; i < argStructType->getNumElements(); i++) {
llvm::Type *currentType = argStructType->getElementType(i);
diff --git a/lib/RSUtils.h b/lib/RSUtils.h
index e7ce1b5..f30f4d1 100644
--- a/lib/RSUtils.h
+++ b/lib/RSUtils.h
@@ -28,6 +28,9 @@
namespace {
static inline llvm::StringRef getUnsuffixedStructName(const llvm::StructType *T) {
+ if (!T) {
+ abort(); // exit?
+ }
#ifdef _DEBUG
// Bug: 22926131
// When building with assertions enabled, LLVM cannot read the name of a
diff --git a/lib/RSX86TranslateGEPPass.cpp b/lib/RSX86TranslateGEPPass.cpp
index 52dee0d..113ca28 100644
--- a/lib/RSX86TranslateGEPPass.cpp
+++ b/lib/RSX86TranslateGEPPass.cpp
@@ -77,6 +77,7 @@ private:
if (!OpC) {
ALOGE("Operand for struct type is not constant!");
bccAssert(false);
+ return nullptr; // NOLINT, unreached
}
// Offset = Offset + EltOffset for index into a struct