mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0e93c9118 | ||
|
|
bf0bc22a11 | ||
|
|
5baa77f86c |
@@ -23,6 +23,6 @@ addons:
|
|||||||
script:
|
script:
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_VALGRIND="${VALGRIND}" -DENABLE_SANITIZERS="${SANITIZERS}"
|
- cmake .. -DENABLE_CJSON_UTILS=On -DENABLE_VALGRIND="${VALGRIND}" -DENABLE_SAFE_STACK="${VALGRIND}" -DENABLE_SANITIZERS="${SANITIZERS}"
|
||||||
- make
|
- make
|
||||||
- make test CTEST_OUTPUT_ON_FAILURE=On
|
- make test CTEST_OUTPUT_ON_FAILURE=On
|
||||||
|
|||||||
@@ -73,6 +73,16 @@ if (ENABLE_SANITIZERS)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
option(ENABLE_SAFE_STACK "Enables the SafeStack instrumentation pass by the Code Pointer Integrity Project" OFF)
|
||||||
|
if (ENABLE_SAFE_STACK)
|
||||||
|
if (ENABLE_SANITIZERS)
|
||||||
|
message(FATAL_ERROR "ENABLE_SAFE_STACK cannot be used in combination with ENABLE_SANITIZERS")
|
||||||
|
endif()
|
||||||
|
list(APPEND custom_compiler_flags
|
||||||
|
-fsanitize=safe-stack
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
option(ENABLE_PUBLIC_SYMBOLS "Export library symbols." On)
|
option(ENABLE_PUBLIC_SYMBOLS "Export library symbols." On)
|
||||||
if (ENABLE_PUBLIC_SYMBOLS)
|
if (ENABLE_PUBLIC_SYMBOLS)
|
||||||
list(APPEND custom_compiler_flags -fvisibility=hidden)
|
list(APPEND custom_compiler_flags -fvisibility=hidden)
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ You can change the build process with a list of different options that you can p
|
|||||||
* `-DENABLE_CUSTOM_COMPILER_FLAGS=On`: Enable custom compiler flags (currently for Clang, GCC and MSVC). Turn off if it makes problems. (on by default)
|
* `-DENABLE_CUSTOM_COMPILER_FLAGS=On`: Enable custom compiler flags (currently for Clang, GCC and MSVC). Turn off if it makes problems. (on by default)
|
||||||
* `-DENABLE_VALGRIND=On`: Run tests with [valgrind](http://valgrind.org). (off by default)
|
* `-DENABLE_VALGRIND=On`: Run tests with [valgrind](http://valgrind.org). (off by default)
|
||||||
* `-DENABLE_SANITIZERS=On`: Compile cJSON with [AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer) and [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) enabled (if possible). (off by default)
|
* `-DENABLE_SANITIZERS=On`: Compile cJSON with [AddressSanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer) and [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) enabled (if possible). (off by default)
|
||||||
|
* `-DENABLE_SAFE_STACK`: Enable the [SafeStack](https://clang.llvm.org/docs/SafeStack.html) instrumentation pass. Currently only works with the Clang compiler. (off by default)
|
||||||
* `-DBUILD_SHARED_LIBS=On`: Build the shared libraries. (on by default)
|
* `-DBUILD_SHARED_LIBS=On`: Build the shared libraries. (on by default)
|
||||||
* `-DBUILD_SHARED_AND_STATIC_LIBS=On`: Build both shared and static libraries. (off by default)
|
* `-DBUILD_SHARED_AND_STATIC_LIBS=On`: Build both shared and static libraries. (off by default)
|
||||||
* `-DCMAKE_INSTALL_PREFIX=/usr`: Set a prefix for the installation.
|
* `-DCMAKE_INSTALL_PREFIX=/usr`: Set a prefix for the installation.
|
||||||
|
|||||||
82
appveyor.yml
Normal file
82
appveyor.yml
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
os: Visual Studio 2015
|
||||||
|
|
||||||
|
# ENABLE_CUSTOM_COMPILER_FLAGS - on by default
|
||||||
|
# ENABLE_SANITIZERS - off by default
|
||||||
|
# ENABLE_PUBLIC_SYMBOLS - on by default
|
||||||
|
# BUILD_SHARED_LIBS - on by default
|
||||||
|
# ENABLE_TARGET_EXPORT - on by default
|
||||||
|
# ENABLE_CJSON_UTILS - off by default
|
||||||
|
# ENABLE_CJSON_TEST -on by default
|
||||||
|
# ENABLE_VALGRIND - off by default
|
||||||
|
# ENABLE_FUZZING - off by default
|
||||||
|
|
||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- GENERATOR: "Visual Studio 14 2015"
|
||||||
|
BUILD_SHARED_LIBS: ON
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 14 2015"
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 12 2013"
|
||||||
|
BUILD_SHARED_LIBS: ON
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 12 2013"
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 11 2012"
|
||||||
|
BUILD_SHARED_LIBS: ON
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 11 2012"
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 10 2010"
|
||||||
|
BUILD_SHARED_LIBS: ON
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 10 2010"
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 9 2008"
|
||||||
|
BUILD_SHARED_LIBS: ON
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
- GENERATOR: "Visual Studio 9 2008"
|
||||||
|
BUILD_SHARED_LIBS: OFF
|
||||||
|
ENABLE_CJSON_TEST: OFF
|
||||||
|
ENABLE_CJSON_UTILS: ON
|
||||||
|
|
||||||
|
|
||||||
|
platform:
|
||||||
|
- x86
|
||||||
|
- x64
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
- Release
|
||||||
|
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- ps: if($env:PLATFORM -eq "x64") { $env:CMAKE_GEN_SUFFIX=" Win64" }
|
||||||
|
- cmake "-G%GENERATOR%%CMAKE_GEN_SUFFIX%" -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% -DENABLE_CJSON_TEST=%ENABLE_CJSON_TEST% -H. -Bbuild
|
||||||
|
- cmake --build build --config "%CONFIGURATION%"
|
||||||
|
|
||||||
|
|
||||||
|
on_failure:
|
||||||
|
- ps: if(Test-Path builds/CMakeFiles/CMakeOutput.log) { cat builds/CMakeFiles/CMakeOutput.log }
|
||||||
|
- ps: if(Test-Path builds/CMakeFiles/CMakeError.log) { cat builds/CMakeFiles/CMakeError.log }
|
||||||
19
cJSON.c
19
cJSON.c
@@ -958,6 +958,22 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)
|
|||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */
|
||||||
|
static parse_buffer *skip_utf8_bom(parse_buffer * const buffer)
|
||||||
|
{
|
||||||
|
if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), "\xEF\xBB\xBF", 3) == 0))
|
||||||
|
{
|
||||||
|
buffer->offset += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
/* Parse an object - create a new root, and populate. */
|
/* Parse an object - create a new root, and populate. */
|
||||||
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
|
||||||
{
|
{
|
||||||
@@ -984,7 +1000,7 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!parse_value(item, buffer_skip_whitespace(&buffer)))
|
if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer))))
|
||||||
{
|
{
|
||||||
/* parse failure. ep is set. */
|
/* parse failure. ep is set. */
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -1222,7 +1238,6 @@ static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buf
|
|||||||
return parse_object(item, input_buffer);
|
return parse_object(item, input_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -410,6 +410,30 @@ static void cjson_functions_shouldnt_crash_with_null_pointers(void)
|
|||||||
cJSON_Delete(item);
|
cJSON_Delete(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void skip_utf8_bom_should_skip_bom(void)
|
||||||
|
{
|
||||||
|
const unsigned char string[] = "\xEF\xBB\xBF{}";
|
||||||
|
parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
|
||||||
|
buffer.content = string;
|
||||||
|
buffer.length = sizeof(string);
|
||||||
|
buffer.hooks = global_hooks;
|
||||||
|
|
||||||
|
TEST_ASSERT_TRUE(skip_utf8_bom(&buffer) == &buffer);
|
||||||
|
TEST_ASSERT_EQUAL_UINT(3U, (unsigned int)buffer.offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void skip_utf8_bom_should_not_skip_bom_if_not_at_beginning(void)
|
||||||
|
{
|
||||||
|
const unsigned char string[] = " \xEF\xBB\xBF{}";
|
||||||
|
parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
|
||||||
|
buffer.content = string;
|
||||||
|
buffer.length = sizeof(string);
|
||||||
|
buffer.hooks = global_hooks;
|
||||||
|
buffer.offset = 1;
|
||||||
|
|
||||||
|
TEST_ASSERT_NULL(skip_utf8_bom(&buffer));
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
UNITY_BEGIN();
|
UNITY_BEGIN();
|
||||||
@@ -425,6 +449,8 @@ int main(void)
|
|||||||
RUN_TEST(cjson_replace_item_via_pointer_should_replace_items);
|
RUN_TEST(cjson_replace_item_via_pointer_should_replace_items);
|
||||||
RUN_TEST(cjson_replace_item_in_object_should_preserve_name);
|
RUN_TEST(cjson_replace_item_in_object_should_preserve_name);
|
||||||
RUN_TEST(cjson_functions_shouldnt_crash_with_null_pointers);
|
RUN_TEST(cjson_functions_shouldnt_crash_with_null_pointers);
|
||||||
|
RUN_TEST(skip_utf8_bom_should_skip_bom);
|
||||||
|
RUN_TEST(skip_utf8_bom_should_not_skip_bom_if_not_at_beginning);
|
||||||
|
|
||||||
return UNITY_END();
|
return UNITY_END();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,22 @@ static void parse_with_opts_should_return_parse_end(void)
|
|||||||
cJSON_Delete(item);
|
cJSON_Delete(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_with_opts_should_parse_utf8_bom(void)
|
||||||
|
{
|
||||||
|
cJSON *with_bom = NULL;
|
||||||
|
cJSON *without_bom = NULL;
|
||||||
|
|
||||||
|
with_bom = cJSON_ParseWithOpts("\xEF\xBB\xBF{}", NULL, true);
|
||||||
|
TEST_ASSERT_NOT_NULL(with_bom);
|
||||||
|
without_bom = cJSON_ParseWithOpts("{}", NULL, true);
|
||||||
|
TEST_ASSERT_NOT_NULL(with_bom);
|
||||||
|
|
||||||
|
TEST_ASSERT_TRUE(cJSON_Compare(with_bom, without_bom, true));
|
||||||
|
|
||||||
|
cJSON_Delete(with_bom);
|
||||||
|
cJSON_Delete(without_bom);
|
||||||
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
UNITY_BEGIN();
|
UNITY_BEGIN();
|
||||||
@@ -77,6 +93,7 @@ int main(void)
|
|||||||
RUN_TEST(parse_with_opts_should_handle_empty_strings);
|
RUN_TEST(parse_with_opts_should_handle_empty_strings);
|
||||||
RUN_TEST(parse_with_opts_should_require_null_if_requested);
|
RUN_TEST(parse_with_opts_should_require_null_if_requested);
|
||||||
RUN_TEST(parse_with_opts_should_return_parse_end);
|
RUN_TEST(parse_with_opts_should_return_parse_end);
|
||||||
|
RUN_TEST(parse_with_opts_should_parse_utf8_bom);
|
||||||
|
|
||||||
return UNITY_END();
|
return UNITY_END();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user