[cfe-commits] [cfe-dev] Miscompilation of sizeof

Abramo Bagnara abramo.bagnara at gmail.com
Sun Dec 11 00:55:12 PST 2011


Il 10/12/2011 22:41, David Blaikie ha scritto:
> Did you mean to attach a patch showing the assert you intend to add?

I believed it was not needed, but I've attached it now for review.

With that patch applied the following testcase (specific for 64 bit
architecture) now triggers the assertion instead to be horribly miscompiled.

#include <stdio.h>

typedef int x[1UL<<59];

int main() {
  printf("%lu\n", sizeof(x));
}


> On Sat, Dec 10, 2011 at 12:52 PM, Abramo Bagnara
> <abramo.bagnara at gmail.com> wrote:
>>
>> Ping.
>>
>>>
>>> In ASTContext:::getTypeInfo(const Type *T) const we have:
>>>
>>>   uint64_t Width=0;
>>>
>>>   case Type::ConstantArray: {
>>>     const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
>>>
>>>     std::pair<uint64_t, unsigned> EltInfo =
>>> getTypeInfo(CAT->getElementType());
>>>     Width = EltInfo.first*CAT->getSize().getZExtValue();
>>>
>>> But this multiplication can overflow (because for reasons that I don't
>>> known getTypeInfo return width specified in bits).
>>>
>>> If there are no objections I'd add an assert: probably we'll induce some
>>> crashes, but I believe that this would be *far* better than to
>>> miscompile the code (and assertions will be triggered only when code
>>> would be miscompiled).
>>>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: PATCH
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20111211/7837808f/attachment.ksh>


More information about the cfe-commits mailing list