re PR d/90559 (Out of memory because of negative length)
PR d/90559 d/dmd: Merge upstream dmd 7afcc60c3 Partially fixes out of memory because of negative length. Reviewed-on: https://github.com/dlang/dmd/pull/10025 gcc/d/ChangeLog: 2019-06-16 Iain Buclaw <ibuclaw@gdcproject.org> PR d/90559 * d-target.cc (Target::_init): Reduce max static data size to INT_MAX. From-SVN: r272351
This commit is contained in:
parent
e5d0ba591e
commit
b0a55e6657
|
@ -1,3 +1,8 @@
|
|||
2019-06-16 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
PR d/90559
|
||||
* d-target.cc (Target::_init): Reduce max static data size to INT_MAX.
|
||||
|
||||
2019-06-16 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
PR d/90651
|
||||
|
|
|
@ -140,8 +140,9 @@ Target::_init (void)
|
|||
/* Size of run-time TypeInfo object. */
|
||||
Target::classinfosize = 19 * Target::ptrsize;
|
||||
|
||||
/* Allow data sizes up to half of the address space. */
|
||||
Target::maxStaticDataSize = tree_to_shwi (TYPE_MAX_VALUE (ptrdiff_type_node));
|
||||
/* Much of the dmd front-end uses ints for sizes and offsets, and cannot
|
||||
handle any larger data type without some pervasive rework. */
|
||||
Target::maxStaticDataSize = tree_to_shwi (TYPE_MAX_VALUE (integer_type_node));
|
||||
|
||||
/* Define what type to use for size_t, ptrdiff_t. */
|
||||
if (POINTER_SIZE == 64)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
f8e38c001b9d7bd6586ee5b3dab7f7f199a69be7
|
||||
7afcc60c30554e452eacdfbefc4951ebf601fccd
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the dlang/dmd repository.
|
||||
|
|
|
@ -841,12 +841,7 @@ FuncDeclaration *buildPostBlit(StructDeclaration *sd, Scope *sc)
|
|||
{
|
||||
// __ArrayPostblit((cast(S*)this.v.ptr)[0 .. n])
|
||||
|
||||
uinteger_t n = 1;
|
||||
while (tv->ty == Tsarray)
|
||||
{
|
||||
n *= ((TypeSArray *)tv)->dim->toUInteger();
|
||||
tv = tv->nextOf()->toBasetype();
|
||||
}
|
||||
uinteger_t n = tv->numberOfElems(loc);
|
||||
if (n == 0)
|
||||
continue;
|
||||
|
||||
|
@ -898,12 +893,7 @@ FuncDeclaration *buildPostBlit(StructDeclaration *sd, Scope *sc)
|
|||
{
|
||||
// __ArrayDtor((cast(S*)this.v.ptr)[0 .. n])
|
||||
|
||||
uinteger_t n = 1;
|
||||
while (tv->ty == Tsarray)
|
||||
{
|
||||
n *= ((TypeSArray *)tv)->dim->toUInteger();
|
||||
tv = tv->nextOf()->toBasetype();
|
||||
}
|
||||
uinteger_t n = tv->numberOfElems(loc);
|
||||
//if (n == 0)
|
||||
// continue;
|
||||
|
||||
|
@ -1049,12 +1039,7 @@ FuncDeclaration *buildDtor(AggregateDeclaration *ad, Scope *sc)
|
|||
{
|
||||
// __ArrayDtor((cast(S*)this.v.ptr)[0 .. n])
|
||||
|
||||
uinteger_t n = 1;
|
||||
while (tv->ty == Tsarray)
|
||||
{
|
||||
n *= ((TypeSArray *)tv)->dim->toUInteger();
|
||||
tv = tv->nextOf()->toBasetype();
|
||||
}
|
||||
uinteger_t n = tv->numberOfElems(loc);
|
||||
if (n == 0)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -5851,16 +5851,8 @@ public:
|
|||
if (exp->op != TOKassign)
|
||||
{
|
||||
// If multidimensional static array, treat as one large array
|
||||
dinteger_t dim = ((TypeSArray *)t1)->dim->toInteger();
|
||||
Type *t = t1;
|
||||
while (1)
|
||||
{
|
||||
t = t->nextOf()->toBasetype();
|
||||
if (t->ty != Tsarray)
|
||||
break;
|
||||
dim *= ((TypeSArray *)t)->dim->toInteger();
|
||||
e1x->type = t->nextOf()->sarrayOf(dim);
|
||||
}
|
||||
dinteger_t dim = t1->numberOfElems(exp->loc);
|
||||
e1x->type = t1->baseElemOf()->sarrayOf(dim);
|
||||
}
|
||||
SliceExp *sle = new SliceExp(e1x->loc, e1x, NULL, NULL);
|
||||
sle->arrayop = true;
|
||||
|
|
|
@ -2517,6 +2517,33 @@ void Type::checkComplexTransition(Loc loc)
|
|||
}
|
||||
}
|
||||
|
||||
/*******************************************
|
||||
* Compute number of elements for a (possibly multidimensional) static array,
|
||||
* or 1 for other types.
|
||||
* Params:
|
||||
* loc = for error message
|
||||
* Returns:
|
||||
* number of elements, uint.max on overflow
|
||||
*/
|
||||
unsigned Type::numberOfElems(const Loc &loc)
|
||||
{
|
||||
//printf("Type::numberOfElems()\n");
|
||||
uinteger_t n = 1;
|
||||
Type *tb = this;
|
||||
while ((tb = tb->toBasetype())->ty == Tsarray)
|
||||
{
|
||||
bool overflow = false;
|
||||
n = mulu(n, ((TypeSArray *)tb)->dim->toUInteger(), overflow);
|
||||
if (overflow || n >= UINT32_MAX)
|
||||
{
|
||||
error(loc, "static array `%s` size overflowed to %llu", toChars(), (unsigned long long)n);
|
||||
return UINT32_MAX;
|
||||
}
|
||||
tb = ((TypeSArray *)tb)->next;
|
||||
}
|
||||
return (unsigned)n;
|
||||
}
|
||||
|
||||
/****************************************
|
||||
* Return the mask that an integral type will
|
||||
* fit into.
|
||||
|
@ -3900,25 +3927,17 @@ Type *TypeSArray::syntaxCopy()
|
|||
d_uns64 TypeSArray::size(Loc loc)
|
||||
{
|
||||
//printf("TypeSArray::size()\n");
|
||||
dinteger_t sz;
|
||||
if (!dim)
|
||||
return Type::size(loc);
|
||||
sz = dim->toInteger();
|
||||
|
||||
uinteger_t n = numberOfElems(loc);
|
||||
uinteger_t elemsize = baseElemOf()->size();
|
||||
bool overflow = false;
|
||||
uinteger_t sz = mulu(n, elemsize, overflow);
|
||||
if (overflow || sz >= UINT32_MAX)
|
||||
{
|
||||
bool overflow = false;
|
||||
|
||||
sz = mulu(next->size(), sz, overflow);
|
||||
if (overflow)
|
||||
goto Loverflow;
|
||||
if (elemsize != SIZE_INVALID && n != UINT32_MAX)
|
||||
error(loc, "static array `%s` size overflowed to %lld", toChars(), (long long)sz);
|
||||
return SIZE_INVALID;
|
||||
}
|
||||
if (sz > UINT32_MAX)
|
||||
goto Loverflow;
|
||||
return sz;
|
||||
|
||||
Loverflow:
|
||||
error(loc, "static array %s size overflowed to %lld", toChars(), (long long)sz);
|
||||
return SIZE_INVALID;
|
||||
}
|
||||
|
||||
unsigned TypeSArray::alignsize()
|
||||
|
|
|
@ -332,6 +332,7 @@ public:
|
|||
virtual Type *nextOf();
|
||||
Type *baseElemOf();
|
||||
uinteger_t sizemask();
|
||||
unsigned numberOfElems(const Loc &loc);
|
||||
virtual bool needsDestruction();
|
||||
virtual bool needsNested();
|
||||
void checkComplexTransition(Loc loc);
|
||||
|
|
|
@ -2,11 +2,14 @@
|
|||
REQUIRED_ARGS: -m64
|
||||
PERMUTE_ARGS:
|
||||
---
|
||||
fail_compilation/staticarrayoverflow.d(21): Error: static array S[1879048192] size overflowed to 7516192768000
|
||||
fail_compilation/staticarrayoverflow.d(21): Error: variable staticarrayoverflow.y size overflow
|
||||
fail_compilation/staticarrayoverflow.d(22): Error: variable staticarrayoverflow.z size of x1000ae0 exceeds max allowed size 0x100_0000
|
||||
fail_compilation/staticarrayoverflow.d(23): Error: static array S[8070450532247928832] size overflowed to 0
|
||||
fail_compilation/staticarrayoverflow.d(23): Error: variable staticarrayoverflow.a size overflow
|
||||
fail_compilation/staticarrayoverflow.d(24): Error: static array `S[1879048192]` size overflowed to 7516192768000
|
||||
fail_compilation/staticarrayoverflow.d(24): Error: variable `staticarrayoverflow.y` size overflow
|
||||
fail_compilation/staticarrayoverflow.d(26): Error: static array `S[8070450532247928832]` size overflowed to 8070450532247928832
|
||||
fail_compilation/staticarrayoverflow.d(26): Error: variable `staticarrayoverflow.a` size overflow
|
||||
fail_compilation/staticarrayoverflow.d(27): Error: static array `S[0][18446744073709551615LU]` size overflowed to 18446744073709551615
|
||||
fail_compilation/staticarrayoverflow.d(27): Error: variable `staticarrayoverflow.b` size overflow
|
||||
fail_compilation/staticarrayoverflow.d(28): Error: static array `S[0][4294967295]` size overflowed to 4294967295
|
||||
fail_compilation/staticarrayoverflow.d(28): Error: variable `staticarrayoverflow.c` size overflow
|
||||
---
|
||||
*/
|
||||
|
||||
|
@ -20,4 +23,5 @@ struct S
|
|||
S[0x7000_0000] y;
|
||||
S[0x100_0000/(4*1000 - 1)] z;
|
||||
S[0x7000_0000_0000_0000] a;
|
||||
|
||||
S[0][-1] b;
|
||||
S[0][uint.max] c;
|
||||
|
|
Loading…
Reference in New Issue