From f6a19fb92556e040db2d6a7b35b504ba7ebca3bf Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Tue, 25 Jan 2011 21:08:47 +0000 Subject: [PATCH] Don't try and symbolicate unions; we don't reason about them yet. Fixes crash reported in PR 9049. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124228 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/SymbolManager.cpp | 4 +++- test/Analysis/misc-ps-region-store.m | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/StaticAnalyzer/SymbolManager.cpp b/lib/StaticAnalyzer/SymbolManager.cpp index 08677dafcf..518bb172d5 100644 --- a/lib/StaticAnalyzer/SymbolManager.cpp +++ b/lib/StaticAnalyzer/SymbolManager.cpp @@ -233,13 +233,15 @@ QualType SymbolRegionValue::getType(ASTContext& C) const { SymbolManager::~SymbolManager() {} bool SymbolManager::canSymbolicate(QualType T) { + T = T.getCanonicalType(); + if (Loc::IsLocType(T)) return true; if (T->isIntegerType()) return T->isScalarType(); - if (T->isRecordType()) + if (T->isRecordType() && !T->isUnionType()) return true; return false; diff --git a/test/Analysis/misc-ps-region-store.m b/test/Analysis/misc-ps-region-store.m index 13a2c1fbe9..6bf79f5011 100644 --- a/test/Analysis/misc-ps-region-store.m +++ b/test/Analysis/misc-ps-region-store.m @@ -1217,3 +1217,23 @@ int rdar8848957(int index) { vals[index] = foo_rdar8848957(); return vals[index].x; // no-warning } + +// PR 9049 - crash on symbolicating unions. This test exists solely to +// test that the analyzer doesn't crash. +typedef struct pr9048_cdev *pr9048_cdev_t; +typedef union pr9048_abstracted_disklabel { void *opaque; } pr9048_disklabel_t; +struct pr9048_diskslice { pr9048_disklabel_t ds_label; }; +struct pr9048_diskslices { + int dss_secmult; + struct pr9048_diskslice dss_slices[16]; +}; +void pr9048(pr9048_cdev_t dev, struct pr9048_diskslices * ssp, unsigned int slice) +{ + pr9048_disklabel_t lp; + struct pr9048_diskslice *sp; + sp = &ssp->dss_slices[slice]; + if (ssp->dss_secmult == 1) { + } else if ((lp = sp->ds_label).opaque != ((void *) 0)) { + } +} + -- 2.50.1