diff --git a/.devcontainer b/.devcontainer index b05bee72bf..32f46e487d 160000 --- a/.devcontainer +++ b/.devcontainer @@ -1 +1 @@ -Subproject commit b05bee72bf7b2b09fe21b2247e5d322d1667529f +Subproject commit 32f46e487d55910b4a899c06d96fa4753b959826 diff --git a/.github/release-tag.json b/.github/release-tag.json new file mode 100644 index 0000000000..0dbdfed26c --- /dev/null +++ b/.github/release-tag.json @@ -0,0 +1,4 @@ +{ + "message": "xpro version 1.1.0-763.4 tag", + "tag": "xpv1.1.0-763.4" +} diff --git a/.github/release-tag.yml b/.github/release-tag.yml deleted file mode 100644 index 2e9887994a..0000000000 --- a/.github/release-tag.yml +++ /dev/null @@ -1,2 +0,0 @@ -tag: xpv1.1.0-763.3 -message: "xpro version 1.1.0-763.3 tag" diff --git a/.github/workflows/xpbuild.yml b/.github/workflows/xpbuild.yml index fd31fce02a..732fc685a2 100644 --- a/.github/workflows/xpbuild.yml +++ b/.github/workflows/xpbuild.yml @@ -14,17 +14,18 @@ jobs: contents: read pull-requests: write packages: write - uses: externpro/externpro/.github/workflows/build-linux.yml@25.07.6 + uses: externpro/externpro/.github/workflows/build-linux.yml@26.01.1 + secrets: + automation_token: ${{ secrets.GHCR_TOKEN }} with: - cmake-workflow-preset: LinuxRelease - secrets: inherit + cmake_workflow_preset_suffix: Release macos: - uses: externpro/externpro/.github/workflows/build-macos.yml@25.07.6 - with: - cmake-workflow-preset: DarwinRelease + uses: externpro/externpro/.github/workflows/build-macos.yml@26.01.1 secrets: inherit - windows: - uses: externpro/externpro/.github/workflows/build-windows.yml@25.07.6 with: - cmake-workflow-preset: WindowsRelease + cmake_workflow_preset_suffix: Release + windows: + uses: externpro/externpro/.github/workflows/build-windows.yml@26.01.1 secrets: inherit + with: + cmake_workflow_preset_suffix: Release diff --git a/.github/workflows/xpinit.yml b/.github/workflows/xpinit.yml new file mode 100644 index 0000000000..4893a2bde4 --- /dev/null +++ b/.github/workflows/xpinit.yml @@ -0,0 +1,12 @@ +name: xpInit externpro +permissions: + contents: write + pull-requests: write + packages: write +on: + workflow_dispatch: +jobs: + init: + uses: externpro/externpro/.github/workflows/init-externpro.yml@main + secrets: + automation_token: ${{ secrets.XPRO_TOKEN }} diff --git a/.github/workflows/xprelease.yml b/.github/workflows/xprelease.yml index a2eb28224c..ec3022d2a2 100644 --- a/.github/workflows/xprelease.yml +++ b/.github/workflows/xprelease.yml @@ -34,7 +34,7 @@ jobs: # Upload build artifacts as release assets release-from-build: if: github.event_name == 'workflow_dispatch' - uses: externpro/externpro/.github/workflows/release-from-build.yml@25.07.6 + uses: externpro/externpro/.github/workflows/release-from-build.yml@26.01.1 with: workflow_run_url: ${{ github.event.inputs.workflow_run_url }} permissions: diff --git a/.github/workflows/xptag.yml b/.github/workflows/xptag.yml index b5ce9503a2..29462130ee 100644 --- a/.github/workflows/xptag.yml +++ b/.github/workflows/xptag.yml @@ -8,9 +8,9 @@ on: jobs: tag: if: ${{ github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'xpro' && contains(github.event.pull_request.labels.*.name, 'release:tag') }} - uses: externpro/externpro/.github/workflows/tag-release.yml@25.07.6 + uses: externpro/externpro/.github/workflows/tag-release.yml@26.01.1 with: merge_sha: ${{ github.event.pull_request.merge_commit_sha }} pr_number: ${{ github.event.pull_request.number }} secrets: - workflow_write_token: ${{ secrets.XPUPDATE_TOKEN }} + automation_token: ${{ secrets.XPRO_TOKEN }} diff --git a/CMakeLists.txt b/CMakeLists.txt index d4707542a0..48ce2727f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 3.5...3.31) +CMAKE_MINIMUM_REQUIRED(VERSION 3.5...4.3) SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules) @@ -7,7 +7,6 @@ set(LIB_MINOR_VERSION "1") set(LIB_PATCH_VERSION "0") set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}") -set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES .devcontainer/cmake/xproinc.cmake) PROJECT(RapidJSON VERSION "${LIB_VERSION_STRING}" LANGUAGES CXX) # compile in release with debug info mode by default @@ -149,7 +148,7 @@ SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}" CACHE PATH "The directory SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}" CACHE STRING "Directory where lib will install") SET(DOC_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/doc/${PROJECT_NAME}" CACHE PATH "Path to the documentation") -IF(NOT DEFINED XP_NAMESPACE) +IF(NOT COMMAND xpExternPackage) SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}") ELSE() SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/cmake") @@ -160,16 +159,16 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) set(lib_name ${PROJECT_NAME}) set(targetsFile ${PROJECT_NAME}-targets) -if(DEFINED XP_NAMESPACE) +if(COMMAND xpExternPackage) set(CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_DIR}") - xpExternPackage(REPO_NAME rapidjson NAMESPACE ${XP_NAMESPACE} - TARGETS_FILE ${targetsFile} LIBRARIES ${lib_name} + xpExternPackage(REPO_NAME rapidjson TARGETS_FILE ${targetsFile} + LIBRARIES ${lib_name} DEFAULT_TARGETS ${lib_name} BASE v${CMAKE_PROJECT_VERSION}-763 XPDIFF "patch" WEB "http://Tencent.github.io/rapidjson/" UPSTREAM "github.com/Tencent/rapidjson" DESC "A fast JSON parser/generator for C++ with both SAX/DOM style API" LICENSE "[MIT](https://raw.githubusercontent.com/Tencent/rapidjson/master/license.txt 'MIT License')" ) - set(nameSpace NAMESPACE ${XP_NAMESPACE}::) + set(nameSpace NAMESPACE rapidjson::) set(OPT_INSTALL EXCLUDE_FROM_ALL) endif() diff --git a/CMakePresets.json b/CMakePresets.json index f82cfdd2cf..28efa3978f 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -3,6 +3,7 @@ "include": [ ".devcontainer/cmake/presets/xpLinuxNinja.json", ".devcontainer/cmake/presets/xpDarwinNinja.json", - ".devcontainer/cmake/presets/xpWindowsVs2022.json" + ".devcontainer/cmake/presets/xpMswVs2022.json", + ".devcontainer/cmake/presets/xpMswVs2026.json" ] } diff --git a/CMakePresetsBase.json b/CMakePresetsBase.json index 4489d79c34..c54ade998a 100644 --- a/CMakePresetsBase.json +++ b/CMakePresetsBase.json @@ -6,7 +6,7 @@ "hidden": true, "binaryDir": "${sourceDir}/_bld-${presetName}", "cacheVariables": { - "XP_NAMESPACE": "xpro" + "CMAKE_EXPERIMENTAL_GENERATE_SBOM": "ca494ed3-b261-4205-a01f-603c95e4cae0" } } ], diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 0d5908c86d..e528c2a999 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5...3.31) +cmake_minimum_required(VERSION 3.5...4.3) if(POLICY CMP0054) cmake_policy(SET CMP0054 NEW) diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index 4b2d723224..b31b651db0 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -2445,13 +2445,23 @@ class GenericValue { data_.f.flags = kShortStringFlag; data_.ss.SetLength(s.length); str = data_.ss.str; - std::memmove(str, s, s.length * sizeof(Ch)); + for (SizeType i = 0; i < s.length; i++) { + if (i == 0 || s.s != 0) // Ensure source is valid + str[i] = s.s[i]; + else + str[i] = '\0'; + } } else { data_.f.flags = kCopyStringFlag; data_.s.length = s.length; str = static_cast(allocator.Malloc((s.length + 1) * sizeof(Ch))); SetStringPointer(str); - std::memcpy(str, s, s.length * sizeof(Ch)); + for (SizeType i = 0; i < s.length; i++) { + if (i == 0 || s.s != 0) // Ensure source is valid + str[i] = s.s[i]; + else + str[i] = '\0'; + } } str[s.length] = '\0'; } diff --git a/include/rapidjson/pointer.h b/include/rapidjson/pointer.h index 355929ede0..9df705df2d 100644 --- a/include/rapidjson/pointer.h +++ b/include/rapidjson/pointer.h @@ -242,7 +242,8 @@ class GenericPointer { GenericPointer r; r.allocator_ = allocator; Ch *p = r.CopyFromRaw(*this, 1, token.length + 1); - std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); + if (p != 0 && token.name != 0) // Ensure both pointers are valid + std::memcpy(p, token.name, (token.length + 1) * sizeof(Ch)); r.tokens_[tokenCount_].name = p; r.tokens_[tokenCount_].length = token.length; r.tokens_[tokenCount_].index = token.index; @@ -892,7 +893,7 @@ class GenericPointer { if (rhs.tokenCount_ > 0) { std::memcpy(tokens_, rhs.tokens_, rhs.tokenCount_ * sizeof(Token)); } - if (nameBufferSize > 0) { + if (nameBufferSize > 0 && rhs.nameBuffer_ != 0) { std::memcpy(nameBuffer_, rhs.nameBuffer_, nameBufferSize * sizeof(Ch)); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7f407e06b6..72e68076df 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,14 +1,17 @@ if(COMMAND xpFindPkg) - xpFindPkg(PKGS googletest) + xpFindPkg(PKGS Threads GTest) enable_testing() - get_target_property(GTEST_INCLUDE_DIR xpro::gtest INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(GTEST_INCLUDE_DIR GTest::gtest INTERFACE_INCLUDE_DIRECTORIES) include_directories(SYSTEM ${GTEST_INCLUDE_DIR}) - set(TEST_LIBRARIES xpro::gtest xpro::gtest_main) - if(FALSE) # doesn't build with googletest-v1.16.0.1 - add_custom_target(tests ALL) - add_subdirectory(perftest) - add_subdirectory(unittest) - endif() + set(TEST_LIBRARIES GTest::gtest GTest::gtest_main) + + # Override C++ standard to C++14 for test targets only + # (Google Test v1.16.0+ requires C++14) + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED TRUE) + add_custom_target(tests ALL) + add_subdirectory(perftest) + add_subdirectory(unittest) else() find_package(GTestSrc) endif() diff --git a/test/perftest/misctest.cpp b/test/perftest/misctest.cpp index f43b050181..ede727271f 100644 --- a/test/perftest/misctest.cpp +++ b/test/perftest/misctest.cpp @@ -764,7 +764,7 @@ void itoa_Writer_StringBufferVerify() { Writer writer(sb); for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; - sprintf(buffer, "%d", randval[j]); + snprintf(buffer, sizeof(buffer), "%d", randval[j]); writer.WriteInt(randval[j]); ASSERT_STREQ(buffer, sb.GetString()); sb.Clear(); @@ -776,7 +776,7 @@ void itoa_Writer_InsituStringStreamVerify() { Writer writer; for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; - sprintf(buffer, "%d", randval[j]); + snprintf(buffer, sizeof(buffer), "%d", randval[j]); char buffer2[32]; rapidjson::InsituStringStream ss(buffer2); writer.Reset(ss); @@ -830,7 +830,7 @@ void itoa64_Writer_StringBufferVerify() { for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; int64_t x = randval[j] * randval[j]; - sprintf(buffer, "%" PRIi64, x); + snprintf(buffer, sizeof(buffer), "%" PRIi64, x); writer.WriteInt64(x); ASSERT_STREQ(buffer, sb.GetString()); sb.Clear(); @@ -843,7 +843,7 @@ void itoa64_Writer_InsituStringStreamVerify() { for (size_t j = 0; j < randvalCount; j++) { char buffer[32]; int64_t x = randval[j] * randval[j]; - sprintf(buffer, "%" PRIi64, x); + snprintf(buffer, sizeof(buffer), "%" PRIi64, x); char buffer2[32]; rapidjson::InsituStringStream ss(buffer2); writer.Reset(ss); diff --git a/test/perftest/perftest.h b/test/perftest/perftest.h index 31e3ca6337..ab444ba1b7 100644 --- a/test/perftest/perftest.h +++ b/test/perftest/perftest.h @@ -138,7 +138,7 @@ class PerfTest : public ::testing::Test { types_[j] = 0; for (size_t i = 0; i < sizeof(typespaths) / sizeof(typespaths[0]); i++) { char filename[256]; - sprintf(filename, "%s/%s", typespaths[i], typesfilenames[j]); + snprintf(filename, sizeof(filename), "%s/%s", typespaths[i], typesfilenames[j]); if (FILE* fp = fopen(filename, "rb")) { fseek(fp, 0, SEEK_END); typesLength_[j] = (size_t)ftell(fp); diff --git a/test/perftest/schematest.cpp b/test/perftest/schematest.cpp index 7d27344b5c..c7ebc5f526 100644 --- a/test/perftest/schematest.cpp +++ b/test/perftest/schematest.cpp @@ -25,10 +25,10 @@ static char* ReadFile(const char* filename, Allocator& allocator) { "../../bin/", "../../../bin/" }; - char buffer[1024]; + char buffer[4096]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { - sprintf(buffer, "%s%s", paths[i], filename); + snprintf(buffer, sizeof(buffer), "%s%s", paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; @@ -92,7 +92,7 @@ class Schema : public PerfTest { for (size_t i = 0; i < ARRAY_SIZE(filenames); i++) { char filename[FILENAME_MAX]; - sprintf(filename, "jsonschema/tests/draft4/%s", filenames[i]); + snprintf(filename, sizeof(filename), "jsonschema/tests/draft4/%s", filenames[i]); char* json = ReadFile(filename, jsonAllocator); if (!json) { printf("json test suite file %s not found", filename); diff --git a/test/unittest/CMakeLists.txt b/test/unittest/CMakeLists.txt index 9a369d4043..7c39cfc167 100644 --- a/test/unittest/CMakeLists.txt +++ b/test/unittest/CMakeLists.txt @@ -81,10 +81,13 @@ add_test(NAME unittest WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) if(NOT MSVC AND VALGRIND_FOUND) - # Not running SIMD.* unit test cases for Valgrind - add_test(NAME valgrind_unittest - COMMAND valgrind --suppressions=${CMAKE_SOURCE_DIR}/test/valgrind.supp --leak-check=full --error-exitcode=1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest --gtest_filter=-SIMD.* - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) + # Only run valgrind test if unittest is available (Debug or Release build types) + if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Release") + # Not running SIMD.* unit test cases for Valgrind + add_test(NAME valgrind_unittest + COMMAND valgrind --suppressions=${CMAKE_SOURCE_DIR}/test/valgrind.supp --leak-check=full --error-exitcode=1 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest --gtest_filter=-SIMD.* + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) + endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_test(NAME symbol_check diff --git a/test/unittest/documenttest.cpp b/test/unittest/documenttest.cpp index c3d1e484dc..0538fc1e45 100644 --- a/test/unittest/documenttest.cpp +++ b/test/unittest/documenttest.cpp @@ -161,9 +161,9 @@ static FILE* OpenEncodedFile(const char* filename) { "../../bin/encodings", "../../../bin/encodings" }; - char buffer[1024]; + char buffer[4096]; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { - sprintf(buffer, "%s/%s", paths[i], filename); + snprintf(buffer, sizeof(buffer), "%s/%s", paths[i], filename); FILE *fp = fopen(buffer, "rb"); if (fp) return fp; @@ -461,7 +461,7 @@ struct DocumentMove: public ::testing::Test { }; typedef ::testing::Types< CrtAllocator, MemoryPoolAllocator<> > MoveAllocatorTypes; -TYPED_TEST_CASE(DocumentMove, MoveAllocatorTypes); +TYPED_TEST_SUITE(DocumentMove, MoveAllocatorTypes); TYPED_TEST(DocumentMove, MoveConstructor) { typedef TypeParam Allocator; diff --git a/test/unittest/encodedstreamtest.cpp b/test/unittest/encodedstreamtest.cpp index 1f0f0e7642..82a50c2c78 100644 --- a/test/unittest/encodedstreamtest.cpp +++ b/test/unittest/encodedstreamtest.cpp @@ -49,9 +49,9 @@ class EncodedStreamTest : public ::testing::Test { "../../bin/encodings", "../../../bin/encodings" }; - char buffer[1024]; + char buffer[4096]; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { - sprintf(buffer, "%s/%s", paths[i], filename); + snprintf(buffer, sizeof(buffer), "%s/%s", paths[i], filename); FILE *fp = fopen(buffer, "rb"); if (fp) return fp; diff --git a/test/unittest/istreamwrappertest.cpp b/test/unittest/istreamwrappertest.cpp index f0cdb2d38c..30e3ab13dc 100644 --- a/test/unittest/istreamwrappertest.cpp +++ b/test/unittest/istreamwrappertest.cpp @@ -111,9 +111,9 @@ static bool Open(FileStreamType& fs, const char* filename) { "../../bin/encodings", "../../../bin/encodings" }; - char buffer[1024]; + char buffer[4096]; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { - sprintf(buffer, "%s/%s", paths[i], filename); + snprintf(buffer, sizeof(buffer), "%s/%s", paths[i], filename); fs.open(buffer, ios_base::in | ios_base::binary); if (fs.is_open()) return true; diff --git a/test/unittest/itoatest.cpp b/test/unittest/itoatest.cpp index 4c834de373..069dbad516 100644 --- a/test/unittest/itoatest.cpp +++ b/test/unittest/itoatest.cpp @@ -28,28 +28,28 @@ struct Traits { template <> struct Traits { - enum { kBufferSize = 11 }; + enum { kBufferSize = 16 }; enum { kMaxDigit = 10 }; static uint32_t Negate(uint32_t x) { return x; } }; template <> struct Traits { - enum { kBufferSize = 12 }; + enum { kBufferSize = 16 }; enum { kMaxDigit = 10 }; static int32_t Negate(int32_t x) { return -x; } }; template <> struct Traits { - enum { kBufferSize = 21 }; + enum { kBufferSize = 24 }; enum { kMaxDigit = 20 }; static uint64_t Negate(uint64_t x) { return x; } }; template <> struct Traits { - enum { kBufferSize = 22 }; + enum { kBufferSize = 24 }; enum { kMaxDigit = 20 }; static int64_t Negate(int64_t x) { return -x; } }; @@ -92,7 +92,7 @@ static void Verify(void(*f)(T, char*), char* (*g)(T, char*)) { } static void u32toa_naive(uint32_t value, char* buffer) { - char temp[10]; + char temp[16]; char *p = temp; do { *p++ = static_cast(char(value % 10) + '0'); @@ -116,7 +116,7 @@ static void i32toa_naive(int32_t value, char* buffer) { } static void u64toa_naive(uint64_t value, char* buffer) { - char temp[20]; + char temp[24]; char *p = temp; do { *p++ = static_cast(char(value % 10) + '0'); diff --git a/test/unittest/jsoncheckertest.cpp b/test/unittest/jsoncheckertest.cpp index 19e1f1c47a..1c2e25f72b 100644 --- a/test/unittest/jsoncheckertest.cpp +++ b/test/unittest/jsoncheckertest.cpp @@ -26,10 +26,10 @@ static char* ReadFile(const char* filename, size_t& length) { "../../bin/jsonchecker", "../../../bin/jsonchecker" }; - char buffer[1024]; + char buffer[4096]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { - sprintf(buffer, "%s/%s", paths[i], filename); + snprintf(buffer, sizeof(buffer), "%s/%s", paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; @@ -76,7 +76,7 @@ TEST(JsonChecker, Reader) { if (i == 18) // fail18.json is valid in rapidjson, which has no limitation on depth of nesting. continue; - sprintf(filename, "fail%d.json", i); + snprintf(filename, sizeof(filename), "fail%d.json", i); size_t length; char* json = ReadFile(filename, length); if (!json) { @@ -110,7 +110,7 @@ TEST(JsonChecker, Reader) { // passX.json for (int i = 1; i <= 3; i++) { - sprintf(filename, "pass%d.json", i); + snprintf(filename, sizeof(filename), "pass%d.json", i); size_t length; char* json = ReadFile(filename, length); if (!json) { diff --git a/test/unittest/readertest.cpp b/test/unittest/readertest.cpp index dec3da6988..663894fd5b 100644 --- a/test/unittest/readertest.cpp +++ b/test/unittest/readertest.cpp @@ -633,7 +633,7 @@ static void TestParseNumberError() { { \ char buffer[2048]; \ ASSERT_LT(std::strlen(str), 2048u); \ - sprintf(buffer, "%s", str); \ + snprintf(buffer, sizeof(buffer), "%s", str); \ InsituStringStream s(buffer); \ BaseReaderHandler<> h; \ Reader reader; \ @@ -1418,12 +1418,12 @@ class WIStreamWrapper { WIStreamWrapper(std::wistream& is) : is_(is) {} Ch Peek() const { - unsigned c = is_.peek(); + auto c = is_.peek(); return c == std::char_traits::eof() ? Ch('\0') : static_cast(c); } Ch Take() { - unsigned c = is_.get(); + auto c = is_.get(); return c == std::char_traits::eof() ? Ch('\0') : static_cast(c); } diff --git a/test/unittest/schematest.cpp b/test/unittest/schematest.cpp index 9d95cd40b4..cab3711aa6 100644 --- a/test/unittest/schematest.cpp +++ b/test/unittest/schematest.cpp @@ -2025,10 +2025,10 @@ static char* ReadFile(const char* filename, Allocator& allocator) { "../../bin/", "../../../bin/" }; - char buffer[1024]; + char buffer[4096]; FILE *fp = 0; for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { - sprintf(buffer, "%s%s", paths[i], filename); + snprintf(buffer, sizeof(buffer), "%s%s", paths[i], filename); fp = fopen(buffer, "rb"); if (fp) break; @@ -2234,7 +2234,7 @@ TEST(SchemaValidator, TestSuite) { for (size_t i = 0; i < sizeof(filenames) / sizeof(filenames[0]); i++) { char filename[FILENAME_MAX]; - sprintf(filename, "jsonschema/tests/draft4/%s", filenames[i]); + snprintf(filename, sizeof(filename), "jsonschema/tests/draft4/%s", filenames[i]); char* json = ReadFile(filename, jsonAllocator); if (!json) { printf("json test suite file %s not found", filename); diff --git a/test/unittest/valuetest.cpp b/test/unittest/valuetest.cpp index bacc4a3761..0c68e9cccd 100644 --- a/test/unittest/valuetest.cpp +++ b/test/unittest/valuetest.cpp @@ -1574,7 +1574,8 @@ TEST(Value, ObjectHelperRangeFor) { for (int i = 0; i < 10; i++) { char name[10]; - Value n(name, static_cast(sprintf(name, "%d", i)), allocator); + SizeType len = static_cast(snprintf(name, sizeof(name), "%d", i)); + Value n(name, len, allocator); x.AddMember(n, i, allocator); } @@ -1582,7 +1583,7 @@ TEST(Value, ObjectHelperRangeFor) { int i = 0; for (auto& m : x.GetObject()) { char name[11]; - sprintf(name, "%d", i); + snprintf(name, sizeof(name), "%d", i); EXPECT_STREQ(name, m.name.GetString()); EXPECT_EQ(i, m.value.GetInt()); i++; @@ -1593,7 +1594,7 @@ TEST(Value, ObjectHelperRangeFor) { int i = 0; for (const auto& m : const_cast(x).GetObject()) { char name[11]; - sprintf(name, "%d", i); + snprintf(name, sizeof(name), "%d", i); EXPECT_STREQ(name, m.name.GetString()); EXPECT_EQ(i, m.value.GetInt()); i++; @@ -1653,7 +1654,7 @@ TEST(Value, BigNestedObject) { for (SizeType i = 0; i < n; i++) { char name1[10]; - sprintf(name1, format, i); + snprintf(name1, sizeof(name1), format, i); // Value name(name1); // should not compile Value name(name1, static_cast(strlen(name1)), allocator); @@ -1661,7 +1662,7 @@ TEST(Value, BigNestedObject) { for (SizeType j = 0; j < n; j++) { char name2[10]; - sprintf(name2, format, j); + snprintf(name2, sizeof(name2), format, j); Value name3(name2, static_cast(strlen(name2)), allocator); Value number(static_cast(i * n + j)); @@ -1674,11 +1675,11 @@ TEST(Value, BigNestedObject) { for (SizeType i = 0; i < n; i++) { char name1[10]; - sprintf(name1, format, i); + snprintf(name1, sizeof(name1), format, i); for (SizeType j = 0; j < n; j++) { char name2[10]; - sprintf(name2, format, j); + snprintf(name2, sizeof(name2), format, j); x[name1]; EXPECT_EQ(static_cast(i * n + j), x[name1][name2].GetInt()); }