From f98d661eaae6daf7ad33b97d76d192697056586c Mon Sep 17 00:00:00 2001 From: Craig Gidney Date: Sun, 21 Sep 2014 17:05:10 -0400 Subject: [PATCH 1/2] Removed size-assuming NSUInteger parsing tests --- Signal/test/util/UtilTest.m | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Signal/test/util/UtilTest.m b/Signal/test/util/UtilTest.m index 230ba0aca..d2d21cef8 100644 --- a/Signal/test/util/UtilTest.m +++ b/Signal/test/util/UtilTest.m @@ -383,18 +383,25 @@ test([@"88ffhih" tryParseAsUnsignedInteger] == nil); test([@"0xA" tryParseAsUnsignedInteger] == nil); test([@"A" tryParseAsUnsignedInteger] == nil); - test([@"4294967297" tryParseAsUnsignedInteger] == nil); - test([@"123456789123456789123456789123456789" tryParseAsUnsignedInteger] == nil); test([@"-1" tryParseAsUnsignedInteger] == nil); test([@"-" tryParseAsUnsignedInteger] == nil); test([[@"0" tryParseAsUnsignedInteger] isEqual:@0]); + test([[@"00" tryParseAsUnsignedInteger] isEqual:@0]); test([[@"1" tryParseAsUnsignedInteger] isEqual:@1]); + test([[@"01" tryParseAsUnsignedInteger] isEqual:@1]); test([[@"25" tryParseAsUnsignedInteger] isEqual:@25]); test([[(@NSUIntegerMax).description tryParseAsUnsignedInteger] isEqual:@NSUIntegerMax]); - if (NSUIntegerMax == 4294967295) { + if (NSUIntegerMax == 4294967295UL) { test([@"4294967296" tryParseAsUnsignedInteger] == nil); } + if (NSUIntegerMax == 18446744073709551615ULL) { + test([@"18446744073709551616" tryParseAsUnsignedInteger] == nil); + } + + NSString* max = (@NSUIntegerMax).description; + NSString* farTooLarge = [max stringByAppendingString:max]; + test([farTooLarge tryParseAsUnsignedInteger] == nil); } -(void) testRemoveAllCharactersIn { testThrows([@"" removeAllCharactersIn:nil]); From a060bea69d8a3417dd9a72dd8e298a20a61cc34d Mon Sep 17 00:00:00 2001 From: Craig Gidney Date: Tue, 7 Oct 2014 11:25:27 -0400 Subject: [PATCH 2/2] Found a method to parse NSUInteger exactly and precisely //FREEBIE --- Signal/src/util/StringUtil.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Signal/src/util/StringUtil.m b/Signal/src/util/StringUtil.m index 5012c2c7a..5159869fc 100644 --- a/Signal/src/util/StringUtil.m +++ b/Signal/src/util/StringUtil.m @@ -134,7 +134,14 @@ -(NSNumber*) tryParseAsDecimalNumber { NSNumberFormatter* formatter = [NSNumberFormatter new]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; - return [formatter numberFromString:self]; + + // NSNumberFormatter.numberFromString is good at noticing bad inputs, but loses precision for large values + // NSDecimalNumber.decimalNumberWithString has perfect precision, but lets bad inputs through sometimes (e.g. "88ffhih" -> 88) + // We use both to get both accuracy and detection of bad inputs + if ([formatter numberFromString:self] == nil) { + return nil; + } + return [NSDecimalNumber decimalNumberWithString:self]; } -(NSNumber*) tryParseAsUnsignedInteger { NSNumber* value = [self tryParseAsDecimalNumber];