diff --git a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp --- a/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/clang/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -761,8 +761,8 @@ // Next fixes pointer dereference using type different from its initial // one. See PR37503 and PR49007 for details. if (const auto *ER = dyn_cast(R)) { - R = StateMgr.getStoreManager().castRegion(ER, CastTy); - return loc::MemRegionVal(R); + if ((R = StateMgr.getStoreManager().castRegion(ER, CastTy))) + return loc::MemRegionVal(R); } return V; diff --git a/clang/test/Analysis/casts.c b/clang/test/Analysis/casts.c --- a/clang/test/Analysis/casts.c +++ b/clang/test/Analysis/casts.c @@ -250,3 +250,19 @@ if (**a == 0) // no-crash ; } + +// See PR50179. +// Just don't crash. +typedef struct taskS { + void *pJob; +} taskS; + +typedef struct workS { + taskS *pTaskList; +} workS; + +void *getTaskJob(unsigned jobId, workS *pWork, unsigned taskId) { + const taskS *pTask = pWork->pTaskList + taskId; + taskS task = *pTask; + return task.pJob; +}