diff options
author | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2015-10-17 10:33:50 -0700 |
---|---|---|
committer | Arseny Kapoulkine <arseny.kapoulkine@gmail.com> | 2015-10-17 10:33:50 -0700 |
commit | 0e09571f21d41969a26e9ec73ef0da78d9371d38 (patch) | |
tree | f4e921109fc05c4595f92e835a3c3ab3488a0868 | |
parent | e8e54ea5de080d33780c68847057adf82c12ec16 (diff) |
Fix integer overflow detection with leading zeros
Since they don't contribute to the resulting value just skip them before
parsing. This matches the behavior of strtol/strtoll and results in more
intuitive behavior.
-rw-r--r-- | src/pugixml.cpp | 8 | ||||
-rw-r--r-- | tests/test_dom_traverse.cpp | 32 |
2 files changed, 40 insertions, 0 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp index 694a1a6..9bb054e 100644 --- a/src/pugixml.cpp +++ b/src/pugixml.cpp @@ -4350,6 +4350,10 @@ PUGI__NS_BEGIN { s += 2; + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + const char_t* start = s; for (;;) @@ -4370,6 +4374,10 @@ PUGI__NS_BEGIN } else { + // since overflow detection relies on length of the sequence skip leading zeros + while (*s == '0') + s++; + const char_t* start = s; for (;;) diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp index c7408cb..6cebd50 100644 --- a/tests/test_dom_traverse.cpp +++ b/tests/test_dom_traverse.cpp @@ -1188,6 +1188,22 @@ TEST_XML(dom_as_uint_hex_overflow, "<node attr1='-0x1' attr2='0x100000000' attr3 CHECK(node.attribute(STR("attr3")).as_uint() == 4294967295); } +TEST_XML(dom_as_int_many_digits, "<node attr1='0000000000000000000000000000000000000000000000001' />") +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.attribute(STR("attr1")).as_int() == 1); + CHECK(node.attribute(STR("attr1")).as_uint() == 1); +} + +TEST_XML(dom_as_int_hex_many_digits, "<node attr1='0x0000000000000000000000000000000000000000000000001' />") +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.attribute(STR("attr1")).as_int() == 1); + CHECK(node.attribute(STR("attr1")).as_uint() == 1); +} + #ifdef PUGIXML_HAS_LONG_LONG TEST_XML(dom_as_llong_overflow, "<node attr1='-9223372036854775809' attr2='9223372036854775808' attr3='-18446744073709551616' />") { @@ -1224,6 +1240,22 @@ TEST_XML(dom_as_ullong_hex_overflow, "<node attr1='-0x1' attr2='0x10000000000000 CHECK(node.attribute(STR("attr2")).as_ullong() == 18446744073709551615ull); CHECK(node.attribute(STR("attr3")).as_ullong() == 18446744073709551615ull); } + +TEST_XML(dom_as_llong_many_digits, "<node attr1='0000000000000000000000000000000000000000000000001' />") +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.attribute(STR("attr1")).as_llong() == 1); + CHECK(node.attribute(STR("attr1")).as_ullong() == 1); +} + +TEST_XML(dom_as_llong_hex_many_digits, "<node attr1='0x0000000000000000000000000000000000000000000000001' />") +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.attribute(STR("attr1")).as_llong() == 1); + CHECK(node.attribute(STR("attr1")).as_ullong() == 1); +} #endif TEST_XML(dom_as_int_plus, "<node attr1='+1' attr2='+0xa' />") |