Author: smanna12 Date: 2024-07-01T10:51:28-05:00 New Revision: 05d8ea77c9bbdedc462dadfdcc41332253c1c829
URL: https://github.com/llvm/llvm-project/commit/05d8ea77c9bbdedc462dadfdcc41332253c1c829 DIFF: https://github.com/llvm/llvm-project/commit/05d8ea77c9bbdedc462dadfdcc41332253c1c829.diff LOG: [Clang] Prevent null pointer dereferences in SVE tuple functions (#94267) This patch addresses a null pointer dereference issue reported by static analyzer tool in the `EmitSVETupleSetOrGet()` and `EmitSVETupleCreate()` functions. Previously, the function assumed that the result of `dyn_cast<>` to `ScalableVectorType` would always be non-null, which is not guaranteed. The fix introduces a null check after the `dyn_cast<>` operation. If the cast fails and `SingleVecTy` is null, the function now returns `nullptr` to indicate an error. This prevents the dereference of a null pointer, which could lead to undefined behavior. Additionally, the assert message has been corrected to accurately reflect the expected conditions. These changes collectively enhance the robustness of the code by ensuring type safety and preventing runtime errors due to improper type casting. Added: Modified: clang/lib/CodeGen/CGBuiltin.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 98c2f70664ec7..ed37267efe715 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -10246,11 +10246,15 @@ Value *CodeGenFunction::EmitSVETupleSetOrGet(const SVETypeFlags &TypeFlags, llvm::Type *Ty, ArrayRef<Value *> Ops) { assert((TypeFlags.isTupleSet() || TypeFlags.isTupleGet()) && - "Expects TypleFlag isTupleSet or TypeFlags.isTupleSet()"); + "Expects TypleFlags.isTupleSet() or TypeFlags.isTupleGet()"); unsigned I = cast<ConstantInt>(Ops[1])->getSExtValue(); auto *SingleVecTy = dyn_cast<llvm::ScalableVectorType>( - TypeFlags.isTupleSet() ? Ops[2]->getType() : Ty); + TypeFlags.isTupleSet() ? Ops[2]->getType() : Ty); + + if (!SingleVecTy) + return nullptr; + Value *Idx = ConstantInt::get(CGM.Int64Ty, I * SingleVecTy->getMinNumElements()); @@ -10265,6 +10269,10 @@ Value *CodeGenFunction::EmitSVETupleCreate(const SVETypeFlags &TypeFlags, assert(TypeFlags.isTupleCreate() && "Expects TypleFlag isTupleCreate"); auto *SrcTy = dyn_cast<llvm::ScalableVectorType>(Ops[0]->getType()); + + if (!SrcTy) + return nullptr; + unsigned MinElts = SrcTy->getMinNumElements(); Value *Call = llvm::PoisonValue::get(Ty); for (unsigned I = 0; I < Ops.size(); I++) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits