1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mfbt/tests/TestIntegerPrintfMacros.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,1264 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.7 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "mozilla/Assertions.h" 1.10 +#include "mozilla/IntegerPrintfMacros.h" // this must pick up <stdint.h> 1.11 + 1.12 +#include <stddef.h> 1.13 +#include <stdio.h> 1.14 +#include <string.h> 1.15 + 1.16 +/* Output array and poisoning method shared by all tests. */ 1.17 +static char output[32]; 1.18 + 1.19 +static void 1.20 +PoisonOutput() 1.21 +{ 1.22 + memset(output, 0xDA, sizeof(output)); 1.23 +} 1.24 + 1.25 +/* 1.26 + * The fprintf macros for signed integers are: 1.27 + * 1.28 + * PRIdN PRIdLEASTN PRIdFASTN PRIdMAX PRIdPTR 1.29 + * PRIiN PRIiLEASTN PRIiFASTN PRIiMAX PRIiPTR 1.30 + * 1.31 + * In these names N is the width of the type as described in C99 7.18.1. 1.32 + */ 1.33 + 1.34 +static void 1.35 +TestPrintSigned8() 1.36 +{ 1.37 + PoisonOutput(); 1.38 + sprintf(output, "%" PRId8, int8_t(-17)); 1.39 + MOZ_RELEASE_ASSERT(!strcmp(output, "-17")); 1.40 + 1.41 + PoisonOutput(); 1.42 + sprintf(output, "%" PRIi8, int8_t(42)); 1.43 + MOZ_RELEASE_ASSERT(!strcmp(output, "42")); 1.44 +} 1.45 + 1.46 +static void 1.47 +TestPrintSigned16() 1.48 +{ 1.49 + PoisonOutput(); 1.50 + sprintf(output, "%" PRId16, int16_t(-289)); 1.51 + MOZ_RELEASE_ASSERT(!strcmp(output, "-289")); 1.52 + 1.53 + PoisonOutput(); 1.54 + sprintf(output, "%" PRIi16, int16_t(728)); 1.55 + MOZ_RELEASE_ASSERT(!strcmp(output, "728")); 1.56 +} 1.57 + 1.58 +static void 1.59 +TestPrintSigned32() 1.60 +{ 1.61 + PoisonOutput(); 1.62 + sprintf(output, "%" PRId32, int32_t(-342178)); 1.63 + MOZ_RELEASE_ASSERT(!strcmp(output, "-342178")); 1.64 + 1.65 + PoisonOutput(); 1.66 + sprintf(output, "%" PRIi32, int32_t(5719283)); 1.67 + MOZ_RELEASE_ASSERT(!strcmp(output, "5719283")); 1.68 +} 1.69 + 1.70 +static void 1.71 +TestPrintSigned64() 1.72 +{ 1.73 + PoisonOutput(); 1.74 + sprintf(output, "%" PRId64, int64_t(-INT64_C(432157943248732))); 1.75 + MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); 1.76 + 1.77 + PoisonOutput(); 1.78 + sprintf(output, "%" PRIi64, int64_t(INT64_C(325719232983))); 1.79 + MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); 1.80 +} 1.81 + 1.82 +static void 1.83 +TestPrintSignedN() 1.84 +{ 1.85 + TestPrintSigned8(); 1.86 + TestPrintSigned16(); 1.87 + TestPrintSigned32(); 1.88 + TestPrintSigned64(); 1.89 +} 1.90 + 1.91 +static void 1.92 +TestPrintSignedLeast8() 1.93 +{ 1.94 + PoisonOutput(); 1.95 + sprintf(output, "%" PRIdLEAST8, int_least8_t(-17)); 1.96 + MOZ_RELEASE_ASSERT(!strcmp(output, "-17")); 1.97 + 1.98 + PoisonOutput(); 1.99 + sprintf(output, "%" PRIiLEAST8, int_least8_t(42)); 1.100 + MOZ_RELEASE_ASSERT(!strcmp(output, "42")); 1.101 +} 1.102 + 1.103 +static void 1.104 +TestPrintSignedLeast16() 1.105 +{ 1.106 + PoisonOutput(); 1.107 + sprintf(output, "%" PRIdLEAST16, int_least16_t(-289)); 1.108 + MOZ_RELEASE_ASSERT(!strcmp(output, "-289")); 1.109 + 1.110 + PoisonOutput(); 1.111 + sprintf(output, "%" PRIiLEAST16, int_least16_t(728)); 1.112 + MOZ_RELEASE_ASSERT(!strcmp(output, "728")); 1.113 +} 1.114 + 1.115 +static void 1.116 +TestPrintSignedLeast32() 1.117 +{ 1.118 + PoisonOutput(); 1.119 + sprintf(output, "%" PRIdLEAST32, int_least32_t(-342178)); 1.120 + MOZ_RELEASE_ASSERT(!strcmp(output, "-342178")); 1.121 + 1.122 + PoisonOutput(); 1.123 + sprintf(output, "%" PRIiLEAST32, int_least32_t(5719283)); 1.124 + MOZ_RELEASE_ASSERT(!strcmp(output, "5719283")); 1.125 +} 1.126 + 1.127 +static void 1.128 +TestPrintSignedLeast64() 1.129 +{ 1.130 + PoisonOutput(); 1.131 + sprintf(output, "%" PRIdLEAST64, int_least64_t(-INT64_C(432157943248732))); 1.132 + MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); 1.133 + 1.134 + PoisonOutput(); 1.135 + sprintf(output, "%" PRIiLEAST64, int_least64_t(INT64_C(325719232983))); 1.136 + MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); 1.137 +} 1.138 + 1.139 +static void 1.140 +TestPrintSignedLeastN() 1.141 +{ 1.142 + TestPrintSignedLeast8(); 1.143 + TestPrintSignedLeast16(); 1.144 + TestPrintSignedLeast32(); 1.145 + TestPrintSignedLeast64(); 1.146 +} 1.147 + 1.148 +static void 1.149 +TestPrintSignedFast8() 1.150 +{ 1.151 + PoisonOutput(); 1.152 + sprintf(output, "%" PRIdFAST8, int_fast8_t(-17)); 1.153 + MOZ_RELEASE_ASSERT(!strcmp(output, "-17")); 1.154 + 1.155 + PoisonOutput(); 1.156 + sprintf(output, "%" PRIiFAST8, int_fast8_t(42)); 1.157 + MOZ_RELEASE_ASSERT(!strcmp(output, "42")); 1.158 +} 1.159 + 1.160 +static void 1.161 +TestPrintSignedFast16() 1.162 +{ 1.163 + PoisonOutput(); 1.164 + sprintf(output, "%" PRIdFAST16, int_fast16_t(-289)); 1.165 + MOZ_RELEASE_ASSERT(!strcmp(output, "-289")); 1.166 + 1.167 + PoisonOutput(); 1.168 + sprintf(output, "%" PRIiFAST16, int_fast16_t(728)); 1.169 + MOZ_RELEASE_ASSERT(!strcmp(output, "728")); 1.170 +} 1.171 + 1.172 +static void 1.173 +TestPrintSignedFast32() 1.174 +{ 1.175 + PoisonOutput(); 1.176 + sprintf(output, "%" PRIdFAST32, int_fast32_t(-342178)); 1.177 + MOZ_RELEASE_ASSERT(!strcmp(output, "-342178")); 1.178 + 1.179 + PoisonOutput(); 1.180 + sprintf(output, "%" PRIiFAST32, int_fast32_t(5719283)); 1.181 + MOZ_RELEASE_ASSERT(!strcmp(output, "5719283")); 1.182 +} 1.183 + 1.184 +static void 1.185 +TestPrintSignedFast64() 1.186 +{ 1.187 + PoisonOutput(); 1.188 + sprintf(output, "%" PRIdFAST64, int_fast64_t(-INT64_C(432157943248732))); 1.189 + MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); 1.190 + 1.191 + PoisonOutput(); 1.192 + sprintf(output, "%" PRIiFAST64, int_fast64_t(INT64_C(325719232983))); 1.193 + MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); 1.194 +} 1.195 + 1.196 +static void 1.197 +TestPrintSignedFastN() 1.198 +{ 1.199 + TestPrintSignedFast8(); 1.200 + TestPrintSignedFast16(); 1.201 + TestPrintSignedFast32(); 1.202 + TestPrintSignedFast64(); 1.203 +} 1.204 + 1.205 +static void 1.206 +TestPrintSignedMax() 1.207 +{ 1.208 + PoisonOutput(); 1.209 + sprintf(output, "%" PRIdMAX, intmax_t(-INTMAX_C(432157943248732))); 1.210 + MOZ_RELEASE_ASSERT(!strcmp(output, "-432157943248732")); 1.211 + 1.212 + PoisonOutput(); 1.213 + sprintf(output, "%" PRIiMAX, intmax_t(INTMAX_C(325719232983))); 1.214 + MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); 1.215 +} 1.216 + 1.217 +static void 1.218 +TestPrintSignedPtr() 1.219 +{ 1.220 + PoisonOutput(); 1.221 + sprintf(output, "%" PRIdPTR, intptr_t(reinterpret_cast<void*>(12345678))); 1.222 + MOZ_RELEASE_ASSERT(!strcmp(output, "12345678")); 1.223 + 1.224 + PoisonOutput(); 1.225 + sprintf(output, "%" PRIiPTR, intptr_t(reinterpret_cast<void*>(87654321))); 1.226 + MOZ_RELEASE_ASSERT(!strcmp(output, "87654321")); 1.227 +} 1.228 + 1.229 +static void 1.230 +TestPrintSigned() 1.231 +{ 1.232 + TestPrintSignedN(); 1.233 + TestPrintSignedLeastN(); 1.234 + TestPrintSignedFastN(); 1.235 + TestPrintSignedMax(); 1.236 + TestPrintSignedPtr(); 1.237 +} 1.238 + 1.239 +/* 1.240 + * The fprintf macros for unsigned integers are: 1.241 + * 1.242 + * PRIoN PRIoLEASTN PRIoFASTN PRIoMAX PRIoPTR 1.243 + * PRIuN PRIuLEASTN PRIuFASTN PRIuMAX PRIuPTR 1.244 + * PRIxN PRIxLEASTN PRIxFASTN PRIxMAX PRIxPTR 1.245 + * PRIXN PRIXLEASTN PRIXFASTN PRIXMAX PRIXPTR 1.246 + * 1.247 + * In these names N is the width of the type as described in C99 7.18.1. 1.248 + */ 1.249 + 1.250 +static void 1.251 +TestPrintUnsigned8() 1.252 +{ 1.253 + PoisonOutput(); 1.254 + sprintf(output, "%" PRIo8, uint8_t(042)); 1.255 + MOZ_RELEASE_ASSERT(!strcmp(output, "42")); 1.256 + 1.257 + PoisonOutput(); 1.258 + sprintf(output, "%" PRIu8, uint8_t(17)); 1.259 + MOZ_RELEASE_ASSERT(!strcmp(output, "17")); 1.260 + 1.261 + PoisonOutput(); 1.262 + sprintf(output, "%" PRIx8, uint8_t(0x2a)); 1.263 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a")); 1.264 + 1.265 + PoisonOutput(); 1.266 + sprintf(output, "%" PRIX8, uint8_t(0xCD)); 1.267 + MOZ_RELEASE_ASSERT(!strcmp(output, "CD")); 1.268 +} 1.269 + 1.270 +static void 1.271 +TestPrintUnsigned16() 1.272 +{ 1.273 + PoisonOutput(); 1.274 + sprintf(output, "%" PRIo16, uint16_t(04242)); 1.275 + MOZ_RELEASE_ASSERT(!strcmp(output, "4242")); 1.276 + 1.277 + PoisonOutput(); 1.278 + sprintf(output, "%" PRIu16, uint16_t(1717)); 1.279 + MOZ_RELEASE_ASSERT(!strcmp(output, "1717")); 1.280 + 1.281 + PoisonOutput(); 1.282 + sprintf(output, "%" PRIx16, uint16_t(0x2a2a)); 1.283 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a")); 1.284 + 1.285 + PoisonOutput(); 1.286 + sprintf(output, "%" PRIX16, uint16_t(0xCDCD)); 1.287 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD")); 1.288 +} 1.289 + 1.290 +static void 1.291 +TestPrintUnsigned32() 1.292 +{ 1.293 + PoisonOutput(); 1.294 + sprintf(output, "%" PRIo32, uint32_t(0424242)); 1.295 + MOZ_RELEASE_ASSERT(!strcmp(output, "424242")); 1.296 + 1.297 + PoisonOutput(); 1.298 + sprintf(output, "%" PRIu32, uint32_t(171717)); 1.299 + MOZ_RELEASE_ASSERT(!strcmp(output, "171717")); 1.300 + 1.301 + PoisonOutput(); 1.302 + sprintf(output, "%" PRIx32, uint32_t(0x2a2a2a)); 1.303 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a")); 1.304 + 1.305 + PoisonOutput(); 1.306 + sprintf(output, "%" PRIX32, uint32_t(0xCDCDCD)); 1.307 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD")); 1.308 +} 1.309 + 1.310 +static void 1.311 +TestPrintUnsigned64() 1.312 +{ 1.313 + PoisonOutput(); 1.314 + sprintf(output, "%" PRIo64, uint64_t(UINT64_C(0424242424242))); 1.315 + MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242")); 1.316 + 1.317 + PoisonOutput(); 1.318 + sprintf(output, "%" PRIu64, uint64_t(UINT64_C(17171717171717171717))); 1.319 + MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717")); 1.320 + 1.321 + PoisonOutput(); 1.322 + sprintf(output, "%" PRIx64, uint64_t(UINT64_C(0x2a2a2a2a2a2a2a))); 1.323 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a")); 1.324 + 1.325 + PoisonOutput(); 1.326 + sprintf(output, "%" PRIX64, uint64_t(UINT64_C(0xCDCDCDCDCDCD))); 1.327 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD")); 1.328 +} 1.329 + 1.330 +static void 1.331 +TestPrintUnsignedN() 1.332 +{ 1.333 + TestPrintUnsigned8(); 1.334 + TestPrintUnsigned16(); 1.335 + TestPrintUnsigned32(); 1.336 + TestPrintUnsigned64(); 1.337 +} 1.338 + 1.339 +static void 1.340 +TestPrintUnsignedLeast8() 1.341 +{ 1.342 + PoisonOutput(); 1.343 + sprintf(output, "%" PRIoLEAST8, uint_least8_t(042)); 1.344 + MOZ_RELEASE_ASSERT(!strcmp(output, "42")); 1.345 + 1.346 + PoisonOutput(); 1.347 + sprintf(output, "%" PRIuLEAST8, uint_least8_t(17)); 1.348 + MOZ_RELEASE_ASSERT(!strcmp(output, "17")); 1.349 + 1.350 + PoisonOutput(); 1.351 + sprintf(output, "%" PRIxLEAST8, uint_least8_t(0x2a)); 1.352 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a")); 1.353 + 1.354 + PoisonOutput(); 1.355 + sprintf(output, "%" PRIXLEAST8, uint_least8_t(0xCD)); 1.356 + MOZ_RELEASE_ASSERT(!strcmp(output, "CD")); 1.357 +} 1.358 + 1.359 +static void 1.360 +TestPrintUnsignedLeast16() 1.361 +{ 1.362 + PoisonOutput(); 1.363 + sprintf(output, "%" PRIoLEAST16, uint_least16_t(04242)); 1.364 + MOZ_RELEASE_ASSERT(!strcmp(output, "4242")); 1.365 + 1.366 + PoisonOutput(); 1.367 + sprintf(output, "%" PRIuLEAST16, uint_least16_t(1717)); 1.368 + MOZ_RELEASE_ASSERT(!strcmp(output, "1717")); 1.369 + 1.370 + PoisonOutput(); 1.371 + sprintf(output, "%" PRIxLEAST16, uint_least16_t(0x2a2a)); 1.372 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a")); 1.373 + 1.374 + PoisonOutput(); 1.375 + sprintf(output, "%" PRIXLEAST16, uint_least16_t(0xCDCD)); 1.376 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD")); 1.377 +} 1.378 + 1.379 +static void 1.380 +TestPrintUnsignedLeast32() 1.381 +{ 1.382 + PoisonOutput(); 1.383 + sprintf(output, "%" PRIoLEAST32, uint_least32_t(0424242)); 1.384 + MOZ_RELEASE_ASSERT(!strcmp(output, "424242")); 1.385 + 1.386 + PoisonOutput(); 1.387 + sprintf(output, "%" PRIuLEAST32, uint_least32_t(171717)); 1.388 + MOZ_RELEASE_ASSERT(!strcmp(output, "171717")); 1.389 + 1.390 + PoisonOutput(); 1.391 + sprintf(output, "%" PRIxLEAST32, uint_least32_t(0x2a2a2a)); 1.392 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a")); 1.393 + 1.394 + PoisonOutput(); 1.395 + sprintf(output, "%" PRIXLEAST32, uint_least32_t(0xCDCDCD)); 1.396 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD")); 1.397 +} 1.398 + 1.399 +static void 1.400 +TestPrintUnsignedLeast64() 1.401 +{ 1.402 + PoisonOutput(); 1.403 + sprintf(output, "%" PRIoLEAST64, uint_least64_t(UINT64_C(0424242424242))); 1.404 + MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242")); 1.405 + 1.406 + PoisonOutput(); 1.407 + sprintf(output, "%" PRIuLEAST64, uint_least64_t(UINT64_C(17171717171717171717))); 1.408 + MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717")); 1.409 + 1.410 + PoisonOutput(); 1.411 + sprintf(output, "%" PRIxLEAST64, uint_least64_t(UINT64_C(0x2a2a2a2a2a2a2a))); 1.412 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a")); 1.413 + 1.414 + PoisonOutput(); 1.415 + sprintf(output, "%" PRIXLEAST64, uint_least64_t(UINT64_C(0xCDCDCDCDCDCD))); 1.416 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD")); 1.417 +} 1.418 + 1.419 +static void 1.420 +TestPrintUnsignedLeastN() 1.421 +{ 1.422 + TestPrintUnsignedLeast8(); 1.423 + TestPrintUnsignedLeast16(); 1.424 + TestPrintUnsignedLeast32(); 1.425 + TestPrintUnsignedLeast64(); 1.426 +} 1.427 + 1.428 +static void 1.429 +TestPrintUnsignedFast8() 1.430 +{ 1.431 + PoisonOutput(); 1.432 + sprintf(output, "%" PRIoFAST8, uint_fast8_t(042)); 1.433 + MOZ_RELEASE_ASSERT(!strcmp(output, "42")); 1.434 + 1.435 + PoisonOutput(); 1.436 + sprintf(output, "%" PRIuFAST8, uint_fast8_t(17)); 1.437 + MOZ_RELEASE_ASSERT(!strcmp(output, "17")); 1.438 + 1.439 + PoisonOutput(); 1.440 + sprintf(output, "%" PRIxFAST8, uint_fast8_t(0x2a)); 1.441 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a")); 1.442 + 1.443 + PoisonOutput(); 1.444 + sprintf(output, "%" PRIXFAST8, uint_fast8_t(0xCD)); 1.445 + MOZ_RELEASE_ASSERT(!strcmp(output, "CD")); 1.446 +} 1.447 + 1.448 +static void 1.449 +TestPrintUnsignedFast16() 1.450 +{ 1.451 + PoisonOutput(); 1.452 + sprintf(output, "%" PRIoFAST16, uint_fast16_t(04242)); 1.453 + MOZ_RELEASE_ASSERT(!strcmp(output, "4242")); 1.454 + 1.455 + PoisonOutput(); 1.456 + sprintf(output, "%" PRIuFAST16, uint_fast16_t(1717)); 1.457 + MOZ_RELEASE_ASSERT(!strcmp(output, "1717")); 1.458 + 1.459 + PoisonOutput(); 1.460 + sprintf(output, "%" PRIxFAST16, uint_fast16_t(0x2a2a)); 1.461 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a")); 1.462 + 1.463 + PoisonOutput(); 1.464 + sprintf(output, "%" PRIXFAST16, uint_fast16_t(0xCDCD)); 1.465 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCD")); 1.466 +} 1.467 + 1.468 +static void 1.469 +TestPrintUnsignedFast32() 1.470 +{ 1.471 + PoisonOutput(); 1.472 + sprintf(output, "%" PRIoFAST32, uint_fast32_t(0424242)); 1.473 + MOZ_RELEASE_ASSERT(!strcmp(output, "424242")); 1.474 + 1.475 + PoisonOutput(); 1.476 + sprintf(output, "%" PRIuFAST32, uint_fast32_t(171717)); 1.477 + MOZ_RELEASE_ASSERT(!strcmp(output, "171717")); 1.478 + 1.479 + PoisonOutput(); 1.480 + sprintf(output, "%" PRIxFAST32, uint_fast32_t(0x2a2a2a)); 1.481 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a")); 1.482 + 1.483 + PoisonOutput(); 1.484 + sprintf(output, "%" PRIXFAST32, uint_fast32_t(0xCDCDCD)); 1.485 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCD")); 1.486 +} 1.487 + 1.488 +static void 1.489 +TestPrintUnsignedFast64() 1.490 +{ 1.491 + PoisonOutput(); 1.492 + sprintf(output, "%" PRIoFAST64, uint_fast64_t(UINT64_C(0424242424242))); 1.493 + MOZ_RELEASE_ASSERT(!strcmp(output, "424242424242")); 1.494 + 1.495 + PoisonOutput(); 1.496 + sprintf(output, "%" PRIuFAST64, uint_fast64_t(UINT64_C(17171717171717171717))); 1.497 + MOZ_RELEASE_ASSERT(!strcmp(output, "17171717171717171717")); 1.498 + 1.499 + PoisonOutput(); 1.500 + sprintf(output, "%" PRIxFAST64, uint_fast64_t(UINT64_C(0x2a2a2a2a2a2a2a))); 1.501 + MOZ_RELEASE_ASSERT(!strcmp(output, "2a2a2a2a2a2a2a")); 1.502 + 1.503 + PoisonOutput(); 1.504 + sprintf(output, "%" PRIXFAST64, uint_fast64_t(UINT64_C(0xCDCDCDCDCDCD))); 1.505 + MOZ_RELEASE_ASSERT(!strcmp(output, "CDCDCDCDCDCD")); 1.506 +} 1.507 + 1.508 +static void 1.509 +TestPrintUnsignedFastN() 1.510 +{ 1.511 + TestPrintUnsignedFast8(); 1.512 + TestPrintUnsignedFast16(); 1.513 + TestPrintUnsignedFast32(); 1.514 + TestPrintUnsignedFast64(); 1.515 +} 1.516 + 1.517 +static void 1.518 +TestPrintUnsignedMax() 1.519 +{ 1.520 + PoisonOutput(); 1.521 + sprintf(output, "%" PRIoMAX, uintmax_t(UINTMAX_C(432157943248732))); 1.522 + MOZ_RELEASE_ASSERT(!strcmp(output, "14220563454333534")); 1.523 + 1.524 + PoisonOutput(); 1.525 + sprintf(output, "%" PRIuMAX, uintmax_t(UINTMAX_C(325719232983))); 1.526 + MOZ_RELEASE_ASSERT(!strcmp(output, "325719232983")); 1.527 + 1.528 + PoisonOutput(); 1.529 + sprintf(output, "%" PRIxMAX, uintmax_t(UINTMAX_C(327281321873))); 1.530 + MOZ_RELEASE_ASSERT(!strcmp(output, "4c337ca791")); 1.531 + 1.532 + PoisonOutput(); 1.533 + sprintf(output, "%" PRIXMAX, uintmax_t(UINTMAX_C(912389523743523))); 1.534 + MOZ_RELEASE_ASSERT(!strcmp(output, "33DD03D75A323")); 1.535 +} 1.536 + 1.537 +static void 1.538 +TestPrintUnsignedPtr() 1.539 +{ 1.540 + PoisonOutput(); 1.541 + sprintf(output, "%" PRIoPTR, uintptr_t(reinterpret_cast<void*>(12345678))); 1.542 + MOZ_RELEASE_ASSERT(!strcmp(output, "57060516")); 1.543 + 1.544 + PoisonOutput(); 1.545 + sprintf(output, "%" PRIuPTR, uintptr_t(reinterpret_cast<void*>(87654321))); 1.546 + MOZ_RELEASE_ASSERT(!strcmp(output, "87654321")); 1.547 + 1.548 + PoisonOutput(); 1.549 + sprintf(output, "%" PRIxPTR, uintptr_t(reinterpret_cast<void*>(0x4c3a791))); 1.550 + MOZ_RELEASE_ASSERT(!strcmp(output, "4c3a791")); 1.551 + 1.552 + PoisonOutput(); 1.553 + sprintf(output, "%" PRIXPTR, uintptr_t(reinterpret_cast<void*>(0xF328DB))); 1.554 + MOZ_RELEASE_ASSERT(!strcmp(output, "F328DB")); 1.555 +} 1.556 + 1.557 +static void 1.558 +TestPrintUnsigned() 1.559 +{ 1.560 + TestPrintUnsignedN(); 1.561 + TestPrintUnsignedLeastN(); 1.562 + TestPrintUnsignedFastN(); 1.563 + TestPrintUnsignedMax(); 1.564 + TestPrintUnsignedPtr(); 1.565 +} 1.566 + 1.567 +static void 1.568 +TestPrint() 1.569 +{ 1.570 + TestPrintSigned(); 1.571 + TestPrintUnsigned(); 1.572 +} 1.573 + 1.574 +/* 1.575 + * The fscanf macros for signed integers are: 1.576 + * 1.577 + * SCNdN SCNdLEASTN SCNdFASTN SCNdMAX SCNdPTR 1.578 + * SCNiN SCNiLEASTN SCNiFASTN SCNiMAX SCNiPTR 1.579 + * 1.580 + * In these names N is the width of the type as described in C99 7.18.1. 1.581 + */ 1.582 + 1.583 +/* 1.584 + * MSVC's scanf is insufficiently powerful to implement all the SCN* macros. 1.585 + * Rather than support some subset of them, we instead support none of them. 1.586 + * See the comment at the top of IntegerPrintfMacros.h. But in case we ever do 1.587 + * support them, the following tests should adequately test implementation 1.588 + * correctness. (Indeed, these tests *revealed* MSVC's limitations.) 1.589 + * 1.590 + * That said, even if MSVC ever picks up complete support, we still probably 1.591 + * don't want to support these, because of the undefined-behavior issue noted 1.592 + * further down in the comment atop IntegerPrintfMacros.h. 1.593 + */ 1.594 +#define SHOULD_TEST_SCANF_MACROS 0 1.595 + 1.596 +#if SHOULD_TEST_SCANF_MACROS 1.597 + 1.598 +/* 1.599 + * glibc header definitions for SCN{d,i,o,u,x}{,LEAST,FAST}8 use the "hh" length 1.600 + * modifier, which is new in C99 (and C++11, by reference). We compile this 1.601 + * file as C++11, so if "hh" is used in these macros, it's standard. But some 1.602 + * versions of gcc wrongly think it isn't and warn about a "non-standard" 1.603 + * modifier. And since these tests mostly exist to verify format-macro/type 1.604 + * consistency (particularly through compiler warnings about incorrect formats), 1.605 + * these warnings are unacceptable. So for now, compile tests for those macros 1.606 + * only if we aren't compiling with gcc. 1.607 + */ 1.608 +#define SHOULD_TEST_8BIT_FORMAT_MACROS (!(MOZ_IS_GCC)) 1.609 + 1.610 +template<typename T> 1.611 +union Input 1.612 +{ 1.613 + T i; 1.614 + unsigned char pun[16]; 1.615 +}; 1.616 + 1.617 +template<typename T> 1.618 +static void 1.619 +PoisonInput(Input<T>& input) 1.620 +{ 1.621 + memset(input.pun, 0xDA, sizeof(input.pun)); 1.622 +} 1.623 + 1.624 +template<typename T> 1.625 +static bool 1.626 +ExtraBitsUntouched(const Input<T>& input) 1.627 +{ 1.628 + for (size_t i = sizeof(input.i); i < sizeof(input); i++) { 1.629 + if (input.pun[i] != 0xDA) 1.630 + return false; 1.631 + } 1.632 + 1.633 + return true; 1.634 +} 1.635 + 1.636 +static void 1.637 +TestScanSigned8() 1.638 +{ 1.639 +#if SHOULD_TEST_8BIT_FORMAT_MACROS 1.640 + Input<int8_t> u; 1.641 + 1.642 + PoisonInput(u); 1.643 + sscanf("-17", "%" SCNd8, &u.i); 1.644 + MOZ_RELEASE_ASSERT(u.i == -17); 1.645 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.646 + 1.647 + PoisonInput(u); 1.648 + sscanf("042", "%" SCNi8, &u.i); 1.649 + MOZ_RELEASE_ASSERT(u.i == 042); 1.650 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.651 +#endif 1.652 +} 1.653 + 1.654 +static void 1.655 +TestScanSigned16() 1.656 +{ 1.657 + Input<int16_t> u; 1.658 + 1.659 + PoisonInput(u); 1.660 + sscanf("-1742", "%" SCNd16, &u.i); 1.661 + MOZ_RELEASE_ASSERT(u.i == -1742); 1.662 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.663 + 1.664 + PoisonInput(u); 1.665 + sscanf("04217", "%" SCNi16, &u.i); 1.666 + MOZ_RELEASE_ASSERT(u.i == 04217); 1.667 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.668 +} 1.669 + 1.670 +static void 1.671 +TestScanSigned32() 1.672 +{ 1.673 + Input<int32_t> u; 1.674 + 1.675 + PoisonInput(u); 1.676 + sscanf("-174257", "%" SCNd32, &u.i); 1.677 + MOZ_RELEASE_ASSERT(u.i == -174257); 1.678 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.679 + 1.680 + PoisonInput(u); 1.681 + sscanf("0423571", "%" SCNi32, &u.i); 1.682 + MOZ_RELEASE_ASSERT(u.i == 0423571); 1.683 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.684 +} 1.685 + 1.686 +static void 1.687 +TestScanSigned64() 1.688 +{ 1.689 + Input<int64_t> u; 1.690 + 1.691 + PoisonInput(u); 1.692 + sscanf("-17425238927232", "%" SCNd64, &u.i); 1.693 + MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232)); 1.694 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.695 + 1.696 + PoisonInput(u); 1.697 + sscanf("042333576571", "%" SCNi64, &u.i); 1.698 + MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571)); 1.699 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.700 +} 1.701 + 1.702 +static void 1.703 +TestScanSignedN() 1.704 +{ 1.705 + TestScanSigned8(); 1.706 + TestScanSigned16(); 1.707 + TestScanSigned32(); 1.708 + TestScanSigned64(); 1.709 +} 1.710 + 1.711 +static void 1.712 +TestScanSignedLeast8() 1.713 +{ 1.714 +#if SHOULD_TEST_8BIT_FORMAT_MACROS 1.715 + Input<int_least8_t> u; 1.716 + 1.717 + PoisonInput(u); 1.718 + sscanf("-17", "%" SCNdLEAST8, &u.i); 1.719 + MOZ_RELEASE_ASSERT(u.i == -17); 1.720 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.721 + 1.722 + PoisonInput(u); 1.723 + sscanf("042", "%" SCNiLEAST8, &u.i); 1.724 + MOZ_RELEASE_ASSERT(u.i == 042); 1.725 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.726 +#endif 1.727 +} 1.728 + 1.729 +static void 1.730 +TestScanSignedLeast16() 1.731 +{ 1.732 + Input<int_least16_t> u; 1.733 + 1.734 + PoisonInput(u); 1.735 + sscanf("-1742", "%" SCNdLEAST16, &u.i); 1.736 + MOZ_RELEASE_ASSERT(u.i == -1742); 1.737 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.738 + 1.739 + PoisonInput(u); 1.740 + sscanf("04217", "%" SCNiLEAST16, &u.i); 1.741 + MOZ_RELEASE_ASSERT(u.i == 04217); 1.742 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.743 +} 1.744 + 1.745 +static void 1.746 +TestScanSignedLeast32() 1.747 +{ 1.748 + Input<int_least32_t> u; 1.749 + 1.750 + PoisonInput(u); 1.751 + sscanf("-174257", "%" SCNdLEAST32, &u.i); 1.752 + MOZ_RELEASE_ASSERT(u.i == -174257); 1.753 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.754 + 1.755 + PoisonInput(u); 1.756 + sscanf("0423571", "%" SCNiLEAST32, &u.i); 1.757 + MOZ_RELEASE_ASSERT(u.i == 0423571); 1.758 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.759 +} 1.760 + 1.761 +static void 1.762 +TestScanSignedLeast64() 1.763 +{ 1.764 + Input<int_least64_t> u; 1.765 + 1.766 + PoisonInput(u); 1.767 + sscanf("-17425238927232", "%" SCNdLEAST64, &u.i); 1.768 + MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232)); 1.769 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.770 + 1.771 + PoisonInput(u); 1.772 + sscanf("042333576571", "%" SCNiLEAST64, &u.i); 1.773 + MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571)); 1.774 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.775 +} 1.776 + 1.777 +static void 1.778 +TestScanSignedLeastN() 1.779 +{ 1.780 + TestScanSignedLeast8(); 1.781 + TestScanSignedLeast16(); 1.782 + TestScanSignedLeast32(); 1.783 + TestScanSignedLeast64(); 1.784 +} 1.785 + 1.786 +static void 1.787 +TestScanSignedFast8() 1.788 +{ 1.789 +#if SHOULD_TEST_8BIT_FORMAT_MACROS 1.790 + Input<int_fast8_t> u; 1.791 + 1.792 + PoisonInput(u); 1.793 + sscanf("-17", "%" SCNdFAST8, &u.i); 1.794 + MOZ_RELEASE_ASSERT(u.i == -17); 1.795 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.796 + 1.797 + PoisonInput(u); 1.798 + sscanf("042", "%" SCNiFAST8, &u.i); 1.799 + MOZ_RELEASE_ASSERT(u.i == 042); 1.800 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.801 +#endif 1.802 +} 1.803 + 1.804 +static void 1.805 +TestScanSignedFast16() 1.806 +{ 1.807 + Input<int_fast16_t> u; 1.808 + 1.809 + PoisonInput(u); 1.810 + sscanf("-1742", "%" SCNdFAST16, &u.i); 1.811 + MOZ_RELEASE_ASSERT(u.i == -1742); 1.812 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.813 + 1.814 + PoisonInput(u); 1.815 + sscanf("04217", "%" SCNiFAST16, &u.i); 1.816 + MOZ_RELEASE_ASSERT(u.i == 04217); 1.817 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.818 +} 1.819 + 1.820 +static void 1.821 +TestScanSignedFast32() 1.822 +{ 1.823 + Input<int_fast32_t> u; 1.824 + 1.825 + PoisonInput(u); 1.826 + sscanf("-174257", "%" SCNdFAST32, &u.i); 1.827 + MOZ_RELEASE_ASSERT(u.i == -174257); 1.828 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.829 + 1.830 + PoisonInput(u); 1.831 + sscanf("0423571", "%" SCNiFAST32, &u.i); 1.832 + MOZ_RELEASE_ASSERT(u.i == 0423571); 1.833 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.834 +} 1.835 + 1.836 +static void 1.837 +TestScanSignedFast64() 1.838 +{ 1.839 + Input<int_fast64_t> u; 1.840 + 1.841 + PoisonInput(u); 1.842 + sscanf("-17425238927232", "%" SCNdFAST64, &u.i); 1.843 + MOZ_RELEASE_ASSERT(u.i == -INT64_C(17425238927232)); 1.844 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.845 + 1.846 + PoisonInput(u); 1.847 + sscanf("042333576571", "%" SCNiFAST64, &u.i); 1.848 + MOZ_RELEASE_ASSERT(u.i == INT64_C(042333576571)); 1.849 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.850 +} 1.851 + 1.852 +static void 1.853 +TestScanSignedFastN() 1.854 +{ 1.855 + TestScanSignedFast8(); 1.856 + TestScanSignedFast16(); 1.857 + TestScanSignedFast32(); 1.858 + TestScanSignedFast64(); 1.859 +} 1.860 + 1.861 +static void 1.862 +TestScanSignedMax() 1.863 +{ 1.864 + Input<intmax_t> u; 1.865 + 1.866 + PoisonInput(u); 1.867 + sscanf("-432157943248732", "%" SCNdMAX, &u.i); 1.868 + MOZ_RELEASE_ASSERT(u.i == -INTMAX_C(432157943248732)); 1.869 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.870 + 1.871 + PoisonInput(u); 1.872 + sscanf("04233357236571", "%" SCNiMAX, &u.i); 1.873 + MOZ_RELEASE_ASSERT(u.i == INTMAX_C(04233357236571)); 1.874 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.875 +} 1.876 + 1.877 +static void 1.878 +TestScanSignedPtr() 1.879 +{ 1.880 + Input<intptr_t> u; 1.881 + 1.882 + PoisonInput(u); 1.883 + sscanf("12345678", "%" SCNdPTR, &u.i); 1.884 + MOZ_RELEASE_ASSERT(u.i == intptr_t(reinterpret_cast<void*>(12345678))); 1.885 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.886 + 1.887 + PoisonInput(u); 1.888 + sscanf("04233357236", "%" SCNiPTR, &u.i); 1.889 + MOZ_RELEASE_ASSERT(u.i == intptr_t(reinterpret_cast<void*>(04233357236))); 1.890 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.891 +} 1.892 + 1.893 +static void 1.894 +TestScanSigned() 1.895 +{ 1.896 + TestScanSignedN(); 1.897 + TestScanSignedLeastN(); 1.898 + TestScanSignedFastN(); 1.899 + TestScanSignedMax(); 1.900 + TestScanSignedPtr(); 1.901 +} 1.902 + 1.903 +/* 1.904 + * The fscanf macros for unsigned integers are: 1.905 + * 1.906 + * SCNoN SCNoLEASTN SCNoFASTN SCNoMAX SCNoPTR 1.907 + * SCNuN SCNuLEASTN SCNuFASTN SCNuMAX SCNuPTR 1.908 + * SCNxN SCNxLEASTN SCNxFASTN SCNxMAX SCNxPTR 1.909 + * 1.910 + * In these names N is the width of the type as described in C99 7.18.1. 1.911 + */ 1.912 + 1.913 +static void 1.914 +TestScanUnsigned8() 1.915 +{ 1.916 +#if SHOULD_TEST_8BIT_FORMAT_MACROS 1.917 + Input<uint8_t> u; 1.918 + 1.919 + PoisonInput(u); 1.920 + sscanf("17", "%" SCNo8, &u.i); 1.921 + MOZ_RELEASE_ASSERT(u.i == 017); 1.922 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.923 + 1.924 + PoisonInput(u); 1.925 + sscanf("42", "%" SCNu8, &u.i); 1.926 + MOZ_RELEASE_ASSERT(u.i == 42); 1.927 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.928 + 1.929 + PoisonInput(u); 1.930 + sscanf("2A", "%" SCNx8, &u.i); 1.931 + MOZ_RELEASE_ASSERT(u.i == 0x2A); 1.932 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.933 +#endif 1.934 +} 1.935 + 1.936 +static void 1.937 +TestScanUnsigned16() 1.938 +{ 1.939 + Input<uint16_t> u; 1.940 + 1.941 + PoisonInput(u); 1.942 + sscanf("1742", "%" SCNo16, &u.i); 1.943 + MOZ_RELEASE_ASSERT(u.i == 01742); 1.944 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.945 + 1.946 + PoisonInput(u); 1.947 + sscanf("4217", "%" SCNu16, &u.i); 1.948 + MOZ_RELEASE_ASSERT(u.i == 4217); 1.949 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.950 + 1.951 + PoisonInput(u); 1.952 + sscanf("2ABC", "%" SCNx16, &u.i); 1.953 + MOZ_RELEASE_ASSERT(u.i == 0x2ABC); 1.954 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.955 +} 1.956 + 1.957 +static void 1.958 +TestScanUnsigned32() 1.959 +{ 1.960 + Input<uint32_t> u; 1.961 + 1.962 + PoisonInput(u); 1.963 + sscanf("17421742", "%" SCNo32, &u.i); 1.964 + MOZ_RELEASE_ASSERT(u.i == 017421742); 1.965 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.966 + 1.967 + PoisonInput(u); 1.968 + sscanf("4217867", "%" SCNu32, &u.i); 1.969 + MOZ_RELEASE_ASSERT(u.i == 4217867); 1.970 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.971 + 1.972 + PoisonInput(u); 1.973 + sscanf("2ABCBEEF", "%" SCNx32, &u.i); 1.974 + MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF); 1.975 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.976 +} 1.977 + 1.978 +static void 1.979 +TestScanUnsigned64() 1.980 +{ 1.981 + Input<uint64_t> u; 1.982 + 1.983 + PoisonInput(u); 1.984 + sscanf("17421742173", "%" SCNo64, &u.i); 1.985 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173)); 1.986 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.987 + 1.988 + PoisonInput(u); 1.989 + sscanf("421786713579", "%" SCNu64, &u.i); 1.990 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579)); 1.991 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.992 + 1.993 + PoisonInput(u); 1.994 + sscanf("DEADBEEF7457E", "%" SCNx64, &u.i); 1.995 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E)); 1.996 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.997 +} 1.998 + 1.999 +static void 1.1000 +TestScanUnsignedN() 1.1001 +{ 1.1002 + TestScanUnsigned8(); 1.1003 + TestScanUnsigned16(); 1.1004 + TestScanUnsigned32(); 1.1005 + TestScanUnsigned64(); 1.1006 +} 1.1007 + 1.1008 +static void 1.1009 +TestScanUnsignedLeast8() 1.1010 +{ 1.1011 +#if SHOULD_TEST_8BIT_FORMAT_MACROS 1.1012 + Input<uint_least8_t> u; 1.1013 + 1.1014 + PoisonInput(u); 1.1015 + sscanf("17", "%" SCNoLEAST8, &u.i); 1.1016 + MOZ_RELEASE_ASSERT(u.i == 017); 1.1017 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1018 + 1.1019 + PoisonInput(u); 1.1020 + sscanf("42", "%" SCNuLEAST8, &u.i); 1.1021 + MOZ_RELEASE_ASSERT(u.i == 42); 1.1022 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1023 + 1.1024 + PoisonInput(u); 1.1025 + sscanf("2A", "%" SCNxLEAST8, &u.i); 1.1026 + MOZ_RELEASE_ASSERT(u.i == 0x2A); 1.1027 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1028 +#endif 1.1029 +} 1.1030 + 1.1031 +static void 1.1032 +TestScanUnsignedLeast16() 1.1033 +{ 1.1034 + Input<uint_least16_t> u; 1.1035 + 1.1036 + PoisonInput(u); 1.1037 + sscanf("1742", "%" SCNoLEAST16, &u.i); 1.1038 + MOZ_RELEASE_ASSERT(u.i == 01742); 1.1039 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1040 + 1.1041 + PoisonInput(u); 1.1042 + sscanf("4217", "%" SCNuLEAST16, &u.i); 1.1043 + MOZ_RELEASE_ASSERT(u.i == 4217); 1.1044 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1045 + 1.1046 + PoisonInput(u); 1.1047 + sscanf("2ABC", "%" SCNxLEAST16, &u.i); 1.1048 + MOZ_RELEASE_ASSERT(u.i == 0x2ABC); 1.1049 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1050 +} 1.1051 + 1.1052 +static void 1.1053 +TestScanUnsignedLeast32() 1.1054 +{ 1.1055 + Input<uint_least32_t> u; 1.1056 + 1.1057 + PoisonInput(u); 1.1058 + sscanf("17421742", "%" SCNoLEAST32, &u.i); 1.1059 + MOZ_RELEASE_ASSERT(u.i == 017421742); 1.1060 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1061 + 1.1062 + PoisonInput(u); 1.1063 + sscanf("4217867", "%" SCNuLEAST32, &u.i); 1.1064 + MOZ_RELEASE_ASSERT(u.i == 4217867); 1.1065 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1066 + 1.1067 + PoisonInput(u); 1.1068 + sscanf("2ABCBEEF", "%" SCNxLEAST32, &u.i); 1.1069 + MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF); 1.1070 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1071 +} 1.1072 + 1.1073 +static void 1.1074 +TestScanUnsignedLeast64() 1.1075 +{ 1.1076 + Input<uint_least64_t> u; 1.1077 + 1.1078 + PoisonInput(u); 1.1079 + sscanf("17421742173", "%" SCNoLEAST64, &u.i); 1.1080 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173)); 1.1081 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1082 + 1.1083 + PoisonInput(u); 1.1084 + sscanf("421786713579", "%" SCNuLEAST64, &u.i); 1.1085 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579)); 1.1086 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1087 + 1.1088 + PoisonInput(u); 1.1089 + sscanf("DEADBEEF7457E", "%" SCNxLEAST64, &u.i); 1.1090 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E)); 1.1091 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1092 +} 1.1093 + 1.1094 +static void 1.1095 +TestScanUnsignedLeastN() 1.1096 +{ 1.1097 + TestScanUnsignedLeast8(); 1.1098 + TestScanUnsignedLeast16(); 1.1099 + TestScanUnsignedLeast32(); 1.1100 + TestScanUnsignedLeast64(); 1.1101 +} 1.1102 + 1.1103 +static void 1.1104 +TestScanUnsignedFast8() 1.1105 +{ 1.1106 +#if SHOULD_TEST_8BIT_FORMAT_MACROS 1.1107 + Input<uint_fast8_t> u; 1.1108 + 1.1109 + PoisonInput(u); 1.1110 + sscanf("17", "%" SCNoFAST8, &u.i); 1.1111 + MOZ_RELEASE_ASSERT(u.i == 017); 1.1112 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1113 + 1.1114 + PoisonInput(u); 1.1115 + sscanf("42", "%" SCNuFAST8, &u.i); 1.1116 + MOZ_RELEASE_ASSERT(u.i == 42); 1.1117 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1118 + 1.1119 + PoisonInput(u); 1.1120 + sscanf("2A", "%" SCNxFAST8, &u.i); 1.1121 + MOZ_RELEASE_ASSERT(u.i == 0x2A); 1.1122 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1123 +#endif 1.1124 +} 1.1125 + 1.1126 +static void 1.1127 +TestScanUnsignedFast16() 1.1128 +{ 1.1129 + Input<uint_fast16_t> u; 1.1130 + 1.1131 + PoisonInput(u); 1.1132 + sscanf("1742", "%" SCNoFAST16, &u.i); 1.1133 + MOZ_RELEASE_ASSERT(u.i == 01742); 1.1134 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1135 + 1.1136 + PoisonInput(u); 1.1137 + sscanf("4217", "%" SCNuFAST16, &u.i); 1.1138 + MOZ_RELEASE_ASSERT(u.i == 4217); 1.1139 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1140 + 1.1141 + PoisonInput(u); 1.1142 + sscanf("2ABC", "%" SCNxFAST16, &u.i); 1.1143 + MOZ_RELEASE_ASSERT(u.i == 0x2ABC); 1.1144 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1145 +} 1.1146 + 1.1147 +static void 1.1148 +TestScanUnsignedFast32() 1.1149 +{ 1.1150 + Input<uint_fast32_t> u; 1.1151 + 1.1152 + PoisonInput(u); 1.1153 + sscanf("17421742", "%" SCNoFAST32, &u.i); 1.1154 + MOZ_RELEASE_ASSERT(u.i == 017421742); 1.1155 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1156 + 1.1157 + PoisonInput(u); 1.1158 + sscanf("4217867", "%" SCNuFAST32, &u.i); 1.1159 + MOZ_RELEASE_ASSERT(u.i == 4217867); 1.1160 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1161 + 1.1162 + PoisonInput(u); 1.1163 + sscanf("2ABCBEEF", "%" SCNxFAST32, &u.i); 1.1164 + MOZ_RELEASE_ASSERT(u.i == 0x2ABCBEEF); 1.1165 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1166 +} 1.1167 + 1.1168 +static void 1.1169 +TestScanUnsignedFast64() 1.1170 +{ 1.1171 + Input<uint_fast64_t> u; 1.1172 + 1.1173 + PoisonInput(u); 1.1174 + sscanf("17421742173", "%" SCNoFAST64, &u.i); 1.1175 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(017421742173)); 1.1176 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1177 + 1.1178 + PoisonInput(u); 1.1179 + sscanf("421786713579", "%" SCNuFAST64, &u.i); 1.1180 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(421786713579)); 1.1181 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1182 + 1.1183 + PoisonInput(u); 1.1184 + sscanf("DEADBEEF7457E", "%" SCNxFAST64, &u.i); 1.1185 + MOZ_RELEASE_ASSERT(u.i == UINT64_C(0xDEADBEEF7457E)); 1.1186 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1187 +} 1.1188 + 1.1189 +static void 1.1190 +TestScanUnsignedFastN() 1.1191 +{ 1.1192 + TestScanUnsignedFast8(); 1.1193 + TestScanUnsignedFast16(); 1.1194 + TestScanUnsignedFast32(); 1.1195 + TestScanUnsignedFast64(); 1.1196 +} 1.1197 + 1.1198 +static void 1.1199 +TestScanUnsignedMax() 1.1200 +{ 1.1201 + Input<uintmax_t> u; 1.1202 + 1.1203 + PoisonInput(u); 1.1204 + sscanf("14220563454333534", "%" SCNoMAX, &u.i); 1.1205 + MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(432157943248732)); 1.1206 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1207 + 1.1208 + PoisonInput(u); 1.1209 + sscanf("432157943248732", "%" SCNuMAX, &u.i); 1.1210 + MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(432157943248732)); 1.1211 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1212 + 1.1213 + PoisonInput(u); 1.1214 + sscanf("4c337ca791", "%" SCNxMAX, &u.i); 1.1215 + MOZ_RELEASE_ASSERT(u.i == UINTMAX_C(327281321873)); 1.1216 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1217 +} 1.1218 + 1.1219 +static void 1.1220 +TestScanUnsignedPtr() 1.1221 +{ 1.1222 + Input<uintptr_t> u; 1.1223 + 1.1224 + PoisonInput(u); 1.1225 + sscanf("57060516", "%" SCNoPTR, &u.i); 1.1226 + MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast<void*>(12345678))); 1.1227 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1228 + 1.1229 + PoisonInput(u); 1.1230 + sscanf("87654321", "%" SCNuPTR, &u.i); 1.1231 + MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast<void*>(87654321))); 1.1232 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1233 + 1.1234 + PoisonInput(u); 1.1235 + sscanf("4c3a791", "%" SCNxPTR, &u.i); 1.1236 + MOZ_RELEASE_ASSERT(u.i == uintptr_t(reinterpret_cast<void*>(0x4c3a791))); 1.1237 + MOZ_RELEASE_ASSERT(ExtraBitsUntouched(u)); 1.1238 +} 1.1239 + 1.1240 +static void 1.1241 +TestScanUnsigned() 1.1242 +{ 1.1243 + TestScanUnsignedN(); 1.1244 + TestScanUnsignedLeastN(); 1.1245 + TestScanUnsignedFastN(); 1.1246 + TestScanUnsignedMax(); 1.1247 + TestScanUnsignedPtr(); 1.1248 +} 1.1249 + 1.1250 +static void 1.1251 +TestScan() 1.1252 +{ 1.1253 + TestScanSigned(); 1.1254 + TestScanUnsigned(); 1.1255 +} 1.1256 + 1.1257 +#endif /* SHOULD_TEST_SCANF_MACROS */ 1.1258 + 1.1259 +int 1.1260 +main() 1.1261 +{ 1.1262 + TestPrint(); 1.1263 +#if SHOULD_TEST_SCANF_MACROS 1.1264 + TestScan(); 1.1265 +#endif 1.1266 + return 0; 1.1267 +}