From 5cdd31147d450933389a0bc2c1b5648764acf506 Mon Sep 17 00:00:00 2001 From: Chih-Hung Hsieh Date: Wed, 21 Dec 2022 16:01:26 -0800 Subject: 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 --- lib/RSGlobalInfoPass.cpp | 20 ++++++++++++++++++++ lib/RSInvokeHelperPass.cpp | 4 ++++ lib/RSUtils.h | 3 +++ lib/RSX86TranslateGEPPass.cpp | 1 + 4 files changed, 28 insertions(+) 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(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(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(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(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(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(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 -- cgit v1.2.3