https://issues.dlang.org/show_bug.cgi?id=16264
--- Comment #2 from Kirill Kryukov <[email protected]> --- Since this crash occurs with particularly large operands, I took a look at the dependence of this bug upon operand sizes. D's BigInt (and BigUint) is represented internally as an array of uint (regardless of whether it's a 32-bit and 64-bit compile). The initial bug-report is with operand of 52 and 82 uints. I took a look at other nearby sizes, and noticed that this bug lives in a narrow sector starting around operand sizes 48 and 74 (in uints). The sector starts there and grows wider as it goes: http://kirr.homeunix.org/temp/d-bug-16264-operand-size-table.png Code used to fill this table (compile a.d into a.exe, then run test.pl): ===== a.d start ===== import std.conv: to; import std.internal.math.biguintcore; void main(string[] args) { uint alen = to!uint(args[1]); uint blen = to!uint(args[2]); string unitstr = args[3]; string astr = ``, bstr = ``; for (int i = 0; i < alen; i++) astr ~= unitstr; for (int i = 0; i < blen; i++) bstr ~= unitstr; BigUint a, b; a.fromHexString(astr); b.fromHexString(bstr); assert(a.uintLength() == alen); assert(b.uintLength() == blen); BigUint c = BigUint.mul(a,b); // Crashes } ===== a.d end ===== ===== test.pl start ===== my ($mina,$maxa,$minb,$maxb) = (40,80,70,120); print ' '; for (my $b = $minb; $b <= $maxb; $b++) { printf " %3d", $b; } print "\n"; for (my $a = $mina; $a <= $maxa; $a++) { printf " %3d", $a; for (my $b = $minb; $b <= $maxb; $b++) { my $e = system("a.exe $a $b FFFFFFFF 2>nul"); print ' ', ($e ? 1 : 0); } print "\n"; } ===== test.pl end ===== I also checked 32-bit compiles - no crashes with any of these operand sizes. --
