summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml4
-rw-r--r--CMakeLists.txt4
-rw-r--r--src/pugixml.cpp46
-rw-r--r--tests/main.cpp2
-rw-r--r--tests/test_compact.cpp34
-rw-r--r--tests/test_document.cpp17
6 files changed, 80 insertions, 27 deletions
diff --git a/.travis.yml b/.travis.yml
index df5569c..f35124d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,4 +14,6 @@ script:
- make test cxxstd=c++11 defines=$DEFINES config=release -j2
- make test cxxstd=c++98 defines=$DEFINES config=debug -j2
-after_success: bash <(curl -s https://codecov.io/bash) -f pugixml.cpp.gcov
+after_success:
+ - sed -e "s/#####\(.*\)\(\/\/ unreachable.*\)/ 1\1\2/" -i pugixml.cpp.gcov
+ - bash <(curl -s https://codecov.io/bash) -f pugixml.cpp.gcov
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8a1169b..855045c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
project(pugixml)
-cmake_minimum_required(VERSION 2.6)
+cmake_minimum_required(VERSION 2.8.12)
option(BUILD_SHARED_LIBS "Build shared instead of static library" OFF)
option(BUILD_TESTS "Build tests" OFF)
@@ -79,4 +79,4 @@ if(BUILD_TESTS)
add_executable(check ${TEST_SOURCES})
target_link_libraries(check pugixml)
add_custom_command(TARGET check POST_BUILD COMMAND check WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
-endif() \ No newline at end of file
+endif()
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 25606d2..ac036e3 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -357,7 +357,7 @@ PUGI__NS_BEGIN
bucket = (bucket + probe + 1) & hashmod;
}
- assert(false && "Hash table is full");
+ assert(false && "Hash table is full"); // unreachable
return 0;
}
@@ -2148,7 +2148,7 @@ PUGI__NS_BEGIN
if (encoding == encoding_latin1)
return convert_buffer_generic(out_buffer, out_length, contents, size, latin1_decoder());
- assert(false && "Invalid encoding");
+ assert(false && "Invalid encoding"); // unreachable
return false;
}
#else
@@ -2253,7 +2253,7 @@ PUGI__NS_BEGIN
if (encoding == encoding_latin1)
return convert_buffer_latin1(out_buffer, out_length, contents, size, is_mutable);
- assert(false && "Invalid encoding");
+ assert(false && "Invalid encoding"); // unreachable
return false;
}
#endif
@@ -2700,7 +2700,7 @@ PUGI__NS_BEGIN
case 5: return strconv_pcdata_impl<opt_true, opt_false, opt_true>::parse;
case 6: return strconv_pcdata_impl<opt_true, opt_true, opt_false>::parse;
case 7: return strconv_pcdata_impl<opt_true, opt_true, opt_true>::parse;
- default: assert(false); return 0; // should not get here
+ default: assert(false); return 0; // unreachable
}
}
@@ -2877,7 +2877,7 @@ PUGI__NS_BEGIN
case 13: return strconv_attribute_impl<opt_true>::parse_wnorm;
case 14: return strconv_attribute_impl<opt_false>::parse_wnorm;
case 15: return strconv_attribute_impl<opt_true>::parse_wnorm;
- default: assert(false); return 0; // should not get here
+ default: assert(false); return 0; // unreachable
}
}
@@ -3626,7 +3626,7 @@ PUGI__NS_BEGIN
if (encoding == encoding_latin1)
return convert_buffer_output_generic(r_u8, data, length, wchar_decoder(), latin1_writer());
- assert(false && "Invalid encoding");
+ assert(false && "Invalid encoding"); // unreachable
return 0;
}
#else
@@ -3665,7 +3665,7 @@ PUGI__NS_BEGIN
if (encoding == encoding_latin1)
return convert_buffer_output_generic(r_u8, data, length, utf8_decoder(), latin1_writer());
- assert(false && "Invalid encoding");
+ assert(false && "Invalid encoding"); // unreachable
return 0;
}
#endif
@@ -4192,7 +4192,7 @@ PUGI__NS_BEGIN
break;
default:
- assert(false && "Invalid node type");
+ assert(false && "Invalid node type"); // unreachable
}
}
@@ -6308,7 +6308,7 @@ namespace pugi
return _root->value && (_root->header & impl::xml_memory_page_value_allocated_or_shared_mask) == 0 ? _root->value - doc.buffer : -1;
default:
- assert(false && "Invalid node type");
+ assert(false && "Invalid node type"); // unreachable
return -1;
}
}
@@ -8523,7 +8523,7 @@ PUGI__NS_BEGIN
break;
default:
- assert(false && "Invalid variable type");
+ assert(false && "Invalid variable type"); // unreachable
}
}
@@ -8544,7 +8544,7 @@ PUGI__NS_BEGIN
return lhs->set(static_cast<const xpath_variable_boolean*>(rhs)->value);
default:
- assert(false && "Invalid variable type");
+ assert(false && "Invalid variable type"); // unreachable
return false;
}
}
@@ -8631,7 +8631,7 @@ PUGI__NS_BEGIN
return *min_element(begin, end, document_order_comparator());
default:
- assert(false && "Invalid node set type");
+ assert(false && "Invalid node set type"); // unreachable
return xpath_node();
}
}
@@ -9361,7 +9361,7 @@ PUGI__NS_BEGIN
}
}
- assert(false && "Wrong types");
+ assert(false && "Wrong types"); // unreachable
return false;
}
@@ -9436,7 +9436,7 @@ PUGI__NS_BEGIN
}
else
{
- assert(false && "Wrong types");
+ assert(false && "Wrong types"); // unreachable
return false;
}
}
@@ -9654,7 +9654,7 @@ PUGI__NS_BEGIN
break;
default:
- assert(false && "Unknown axis");
+ assert(false && "Unknown axis"); // unreachable
}
return false;
@@ -9849,7 +9849,7 @@ PUGI__NS_BEGIN
}
default:
- assert(false && "Unimplemented axis");
+ assert(false && "Unimplemented axis"); // unreachable
}
}
@@ -9930,7 +9930,7 @@ PUGI__NS_BEGIN
}
default:
- assert(false && "Unimplemented axis");
+ assert(false && "Unimplemented axis"); // unreachable
}
}
@@ -10171,7 +10171,7 @@ PUGI__NS_BEGIN
}
default:
- assert(false && "Wrong expression for return type boolean");
+ assert(false && "Wrong expression for return type boolean"); // unreachable
return false;
}
}
@@ -10306,7 +10306,7 @@ PUGI__NS_BEGIN
}
default:
- assert(false && "Wrong expression for return type number");
+ assert(false && "Wrong expression for return type number"); // unreachable
return 0;
}
@@ -10596,7 +10596,7 @@ PUGI__NS_BEGIN
}
default:
- assert(false && "Wrong expression for return type string");
+ assert(false && "Wrong expression for return type string"); // unreachable
return xpath_string();
}
}
@@ -10687,7 +10687,7 @@ PUGI__NS_BEGIN
return step_do(c, stack, eval, axis_to_type<axis_self>());
default:
- assert(false && "Unknown axis");
+ assert(false && "Unknown axis"); // unreachable
return xpath_node_set_raw();
}
}
@@ -10725,7 +10725,7 @@ PUGI__NS_BEGIN
// fallthrough
default:
- assert(false && "Wrong expression for return type node set");
+ assert(false && "Wrong expression for return type node set"); // unreachable
return xpath_node_set_raw();
}
}
@@ -12067,7 +12067,7 @@ namespace pugi
return static_cast<const impl::xpath_variable_boolean*>(this)->name;
default:
- assert(false && "Invalid variable type");
+ assert(false && "Invalid variable type"); // unreachable
return 0;
}
}
diff --git a/tests/main.cpp b/tests/main.cpp
index 712edda..352b58b 100644
--- a/tests/main.cpp
+++ b/tests/main.cpp
@@ -41,7 +41,7 @@ static void* custom_allocate(size_t size)
else
{
void* ptr = memory_allocate(size);
- assert(ptr);
+ if (!ptr) return 0;
g_memory_total_size += memory_size(ptr);
g_memory_total_count++;
diff --git a/tests/test_compact.cpp b/tests/test_compact.cpp
index f9560c9..f5dc4ee 100644
--- a/tests/test_compact.cpp
+++ b/tests/test_compact.cpp
@@ -111,4 +111,38 @@ TEST_XML(compact_out_of_memory_remove, "<n a='v'/>")
CHECK_ALLOC_FAIL(CHECK(!n.remove_attribute(a)));
CHECK_ALLOC_FAIL(CHECK(!doc.remove_child(n)));
}
+
+TEST_XML(compact_pointer_attribute_list, "<n a='v'/>")
+{
+ xml_node n = doc.child(STR("n"));
+ xml_attribute a = n.attribute(STR("a"));
+
+ // make sure we fill the page with node x
+ for (int i = 0; i < 1000; ++i)
+ doc.append_child(STR("x"));
+
+ // this requires extended encoding for prev_attribute_c/next_attribute
+ n.append_attribute(STR("b"));
+
+ // this requires extended encoding for first_attribute
+ n.remove_attribute(a);
+
+ CHECK(!n.attribute(STR("a")));
+ CHECK(n.attribute(STR("b")));
+}
+
+TEST_XML(compact_pointer_node_list, "<n/>")
+{
+ xml_node n = doc.child(STR("n"));
+
+ // make sure we fill the page with node x
+ // this requires extended encoding for prev_sibling_c/next_sibling
+ for (int i = 0; i < 1000; ++i)
+ doc.append_child(STR("x"));
+
+ // this requires extended encoding for first_child
+ n.append_child(STR("child"));
+
+ CHECK(n.child(STR("child")));
+}
#endif
diff --git a/tests/test_document.cpp b/tests/test_document.cpp
index 9860737..c7ceb8f 100644
--- a/tests/test_document.cpp
+++ b/tests/test_document.cpp
@@ -383,6 +383,23 @@ TEST(document_load_file_wide_out_of_memory)
CHECK(result.status == status_out_of_memory || result.status == status_file_not_found);
}
+#if defined(__linux__) || defined(__APPLE__)
+TEST(document_load_file_special_folder)
+{
+ xml_document doc;
+ xml_parse_result result = doc.load_file(".");
+ // status_out_of_memory is somewhat counter-intuitive but on Linux ftell returns LONG_MAX for directories
+ CHECK(result.status == status_file_not_found || result.status == status_io_error || result.status == status_out_of_memory);
+}
+
+TEST(document_load_file_special_device)
+{
+ xml_document doc;
+ xml_parse_result result = doc.load_file("/dev/tty");
+ CHECK(result.status == status_file_not_found || result.status == status_io_error);
+}
+#endif
+
TEST_XML(document_save, "<node/>")
{
xml_writer_string writer;