Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 07b5c36

Browse files
committed
Statically disallow invalid radix, fix unittests
1 parent d594bb4 commit 07b5c36

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

src/core/internal/string.d

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,8 @@ Returns:
2929
The unsigned integer value as a string of characters
3030
*/
3131
char[] unsignedToTempString(uint radix = 10)(ulong value, return scope char[] buf) @safe
32+
if (radix >= 2 && radix <= 16)
3233
{
33-
if (radix < 2)
34-
// not a valid radix, just return an empty string
35-
return buf[$ .. $];
36-
3734
size_t i = buf.length;
3835
do
3936
{
@@ -105,8 +102,8 @@ unittest
105102
assert(ulong.max.unsignedToTempString == "18446744073709551615");
106103

107104
// test bad radices
108-
assert(100.unsignedToTempString!1(buf) == "");
109-
assert(100.unsignedToTempString!0(buf) == "");
105+
assert(!is(typeof(100.unsignedToTempString!1(buf))));
106+
assert(!is(typeof(100.unsignedToTempString!0(buf) == "")));
110107
}
111108

112109
alias SignedStringBuf = char[20];
@@ -144,34 +141,34 @@ auto signedToTempString(uint radix = 10)(long value) @safe
144141
unittest
145142
{
146143
SignedStringBuf buf;
147-
assert(0.signedToTempString(buf, 10) == "0");
144+
assert(0.signedToTempString(buf) == "0");
148145
assert(1.signedToTempString(buf) == "1");
149146
assert((-1).signedToTempString(buf) == "-1");
150147
assert(12.signedToTempString(buf) == "12");
151148
assert((-12).signedToTempString(buf) == "-12");
152-
assert(0x12ABCF .signedToTempString(buf, 16) == "12abcf");
153-
assert((-0x12ABCF) .signedToTempString(buf, 16) == "-12abcf");
149+
assert(0x12ABCF .signedToTempString(buf) == "12abcf");
150+
assert((-0x12ABCF) .signedToTempString(buf) == "-12abcf");
154151
assert(long.sizeof.signedToTempString(buf) == "8");
155152
assert(int.max.signedToTempString(buf) == "2147483647");
156153
assert(int.min.signedToTempString(buf) == "-2147483648");
157154
assert(long.max.signedToTempString(buf) == "9223372036854775807");
158155
assert(long.min.signedToTempString(buf) == "-9223372036854775808");
159156

160157
// use stack allocated struct version
161-
assert(0.signedToTempString(10) == "0");
158+
assert(0.signedToTempString() == "0");
162159
assert(1.signedToTempString == "1");
163160
assert((-1).signedToTempString == "-1");
164161
assert(12.signedToTempString == "12");
165162
assert((-12).signedToTempString == "-12");
166-
assert(0x12ABCF .signedToTempString(16) == "12abcf");
167-
assert((-0x12ABCF) .signedToTempString(16) == "-12abcf");
163+
assert(0x12ABCF .signedToTempString!16 == "12abcf");
164+
assert((-0x12ABCF) .signedToTempString!16 == "-12abcf");
168165
assert(long.sizeof.signedToTempString == "8");
169166
assert(int.max.signedToTempString == "2147483647");
170167
assert(int.min.signedToTempString == "-2147483648");
171168
assert(long.max.signedToTempString == "9223372036854775807");
172169
assert(long.min.signedToTempString == "-9223372036854775808");
173-
assert(long.max.signedToTempString(2) == "111111111111111111111111111111111111111111111111111111111111111");
174-
assert(long.min.signedToTempString(2) == "-1000000000000000000000000000000000000000000000000000000000000000");
170+
assert(long.max.signedToTempString!2 == "111111111111111111111111111111111111111111111111111111111111111");
171+
assert(long.min.signedToTempString!2 == "-1000000000000000000000000000000000000000000000000000000000000000");
175172
}
176173

177174

src/core/time.d

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,7 +1806,7 @@ unittest
18061806
auto _str(F)(F val)
18071807
{
18081808
static if (is(F == int) || is(F == long))
1809-
return signedToTempString(val, 10);
1809+
return signedToTempString(val);
18101810
else
18111811
return unsignedToTempString(val);
18121812
}
@@ -2407,8 +2407,8 @@ assert(before + timeElapsed == after);
24072407
static if (clockType == ClockType.normal)
24082408
return "MonoTime(" ~ signedToTempString(_ticks) ~ " ticks, " ~ signedToTempString(ticksPerSecond) ~ " ticks per second)";
24092409
else
2410-
return "MonoTimeImpl!(ClockType." ~ _clockName ~ ")(" ~ signedToTempString(_ticks, 10) ~ " ticks, " ~
2411-
signedToTempString(ticksPerSecond, 10) ~ " ticks per second)";
2410+
return "MonoTimeImpl!(ClockType." ~ _clockName ~ ")(" ~ signedToTempString(_ticks) ~ " ticks, " ~
2411+
signedToTempString(ticksPerSecond) ~ " ticks per second)";
24122412
}
24132413

24142414
version (CoreUnittest) unittest
@@ -2428,9 +2428,9 @@ assert(before + timeElapsed == after);
24282428
else
24292429
eat(str, "MonoTimeImpl!(ClockType."~_clockName~")(");
24302430

2431-
eat(str, signedToTempString(mt._ticks, 10));
2431+
eat(str, signedToTempString(mt._ticks));
24322432
eat(str, " ticks, ");
2433-
eat(str, signedToTempString(ticksPerSecond, 10));
2433+
eat(str, signedToTempString(ticksPerSecond));
24342434
eat(str, " ticks per second)");
24352435
}
24362436

@@ -3970,7 +3970,7 @@ string doubleToString(double value) @safe pure nothrow
39703970
if (value < 0 && cast(long)value == 0)
39713971
result = "-0";
39723972
else
3973-
result = signedToTempString(cast(long)value, 10).idup;
3973+
result = signedToTempString(cast(long)value).idup;
39743974
result ~= '.';
39753975
result ~= unsignedToTempString(cast(ulong)(_abs((value - cast(long)value) * 1_000_000) + .5));
39763976

@@ -3996,7 +3996,7 @@ unittest
39963996

39973997
version (CoreUnittest) const(char)* numToStringz()(long value) @trusted pure nothrow
39983998
{
3999-
return (signedToTempString(value, 10) ~ "\0").ptr;
3999+
return (signedToTempString(value) ~ "\0").ptr;
40004000
}
40014001

40024002

@@ -4121,9 +4121,9 @@ version (CoreUnittest) void assertApprox(D, E)(D actual,
41214121
{
41224122
if (actual.length < lower.length || actual.length > upper.length)
41234123
{
4124-
throw new AssertError(msg ~ (": [" ~ signedToTempString(lower.length, 10) ~ "] [" ~
4125-
signedToTempString(actual.length, 10) ~ "] [" ~
4126-
signedToTempString(upper.length, 10) ~ "]").idup,
4124+
throw new AssertError(msg ~ (": [" ~ signedToTempString(lower.length) ~ "] [" ~
4125+
signedToTempString(actual.length) ~ "] [" ~
4126+
signedToTempString(upper.length) ~ "]").idup,
41274127
__FILE__, line);
41284128
}
41294129
}
@@ -4145,7 +4145,7 @@ version (CoreUnittest) void assertApprox()(long actual,
41454145
size_t line = __LINE__)
41464146
{
41474147
if (actual < lower)
4148-
throw new AssertError(msg ~ ": lower: " ~ signedToTempString(actual, 10).idup, __FILE__, line);
4148+
throw new AssertError(msg ~ ": lower: " ~ signedToTempString(actual).idup, __FILE__, line);
41494149
if (actual > upper)
4150-
throw new AssertError(msg ~ ": upper: " ~ signedToTempString(actual, 10).idup, __FILE__, line);
4150+
throw new AssertError(msg ~ ": upper: " ~ signedToTempString(actual).idup, __FILE__, line);
41514151
}

0 commit comments

Comments
 (0)