From: Ted Kremenek Date: Mon, 15 Dec 2008 18:51:00 +0000 (+0000) Subject: Fix regression in handling sizeof(void) in the static analyzer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=55f7bcbda37964d3c0e8928d0e50a6e1692b7dce;p=clang Fix regression in handling sizeof(void) in the static analyzer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61039 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp index d6b15b1e2c..769e4b31a6 100644 --- a/lib/Analysis/GRExprEngine.cpp +++ b/lib/Analysis/GRExprEngine.cpp @@ -1973,22 +1973,24 @@ void GRExprEngine::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr* Ex, uint64_t amt; if (Ex->isSizeOf()) { - - // FIXME: Add support for VLAs. - if (!T.getTypePtr()->isConstantSizeType()) + if (T == getContext().VoidTy) { + // sizeof(void) == 1 byte. + amt = 1; + } + else if (!T.getTypePtr()->isConstantSizeType()) { + // FIXME: Add support for VLAs. return; - - // Some code tries to take the sizeof an ObjCInterfaceType, relying that - // the compiler has laid out its representation. Just report Unknown - // for these. - if (T->isObjCInterfaceType()) + } + else if (T->isObjCInterfaceType()) { + // Some code tries to take the sizeof an ObjCInterfaceType, relying that + // the compiler has laid out its representation. Just report Unknown + // for these. return; - - amt = 1; // Handle sizeof(void) - - if (T != getContext().VoidTy) + } + else { + // All other cases. amt = getContext().getTypeSize(T) / 8; - + } } else // Get alignment of the type. amt = getContext().getTypeAlign(T) / 8; diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index be697f8f3a..5fccf5724e 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -87,3 +87,28 @@ void check_uninit_sized_VLA() { int vla[x]; // expected-warning{{The expression used to specify the number of elements in the VLA 'vla' evaluates to an undefined or garbage value.}} } +// sizeof(void) +// - Tests a regression reported in PR 3211: http://llvm.org/bugs/show_bug.cgi?id=3211 +void handle_sizeof_void(unsigned flag) { + int* p = 0; + + if (flag) { + if (sizeof(void) == 1) + return; + // Infeasible. + *p = 1; // no-warning + } + + void* q; + + if (!flag) { + if (sizeof(*q) == 1) + return; + // Infeasibe. + *p = 1; // no-warning + } + + // Infeasible. + *p = 1; // no-warning +} +