mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-22 21:36:11 +01:00
Fix stringifying static array of unsigned chars
The fix leaves an open question: should we keep treating refs to static array of chars as strings, or should we instead use `strnlen` to check if it is null-terminated within the buffer Fixes #1238
This commit is contained in:
parent
1ca8f43b01
commit
ab30621138
@ -155,6 +155,7 @@ namespace Catch {
|
|||||||
struct StringMaker<char *> {
|
struct StringMaker<char *> {
|
||||||
static std::string convert(char * str);
|
static std::string convert(char * str);
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CATCH_CONFIG_WCHAR
|
#ifdef CATCH_CONFIG_WCHAR
|
||||||
template<>
|
template<>
|
||||||
struct StringMaker<wchar_t const *> {
|
struct StringMaker<wchar_t const *> {
|
||||||
@ -166,22 +167,24 @@ namespace Catch {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// TBD: Should we use `strnlen` to ensure that we don't go out of the buffer,
|
||||||
|
// while keeping string semantics?
|
||||||
template<int SZ>
|
template<int SZ>
|
||||||
struct StringMaker<char[SZ]> {
|
struct StringMaker<char[SZ]> {
|
||||||
static std::string convert(const char* str) {
|
static std::string convert(char const* str) {
|
||||||
return ::Catch::Detail::stringify(std::string{ str });
|
return ::Catch::Detail::stringify(std::string{ str });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<int SZ>
|
template<int SZ>
|
||||||
struct StringMaker<signed char[SZ]> {
|
struct StringMaker<signed char[SZ]> {
|
||||||
static std::string convert(const char* str) {
|
static std::string convert(signed char const* str) {
|
||||||
return ::Catch::Detail::stringify(std::string{ str });
|
return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<int SZ>
|
template<int SZ>
|
||||||
struct StringMaker<unsigned char[SZ]> {
|
struct StringMaker<unsigned char[SZ]> {
|
||||||
static std::string convert(const char* str) {
|
static std::string convert(unsigned char const* str) {
|
||||||
return ::Catch::Detail::stringify(std::string{ str });
|
return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,6 +10,8 @@ Compilation.tests.cpp:<line number>: passed: t1 > t2 for: {?} > {?}
|
|||||||
Compilation.tests.cpp:<line number>: passed: t1 <= t2 for: {?} <= {?}
|
Compilation.tests.cpp:<line number>: passed: t1 <= t2 for: {?} <= {?}
|
||||||
Compilation.tests.cpp:<line number>: passed: t1 >= t2 for: {?} >= {?}
|
Compilation.tests.cpp:<line number>: passed: t1 >= t2 for: {?} >= {?}
|
||||||
Misc.tests.cpp:<line number>: passed:
|
Misc.tests.cpp:<line number>: passed:
|
||||||
|
Compilation.tests.cpp:<line number>: passed: std::memcmp(uarr, "123", sizeof(uarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
|
||||||
|
Compilation.tests.cpp:<line number>: passed: std::memcmp(sarr, "456", sizeof(sarr)) == 0 for: 0 == 0 with 2 messages: 'uarr := "123"' and 'sarr := "456"'
|
||||||
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42' with 1 message: 'expected exception'
|
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42' with 1 message: 'expected exception'
|
||||||
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42'; expression was: thisThrows() with 1 message: 'expected exception'
|
Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42'; expression was: thisThrows() with 1 message: 'expected exception'
|
||||||
Exception.tests.cpp:<line number>: passed: thisThrows() with 1 message: 'answer := 42'
|
Exception.tests.cpp:<line number>: passed: thisThrows() with 1 message: 'answer := 42'
|
||||||
|
@ -1084,6 +1084,6 @@ due to unexpected exception with message:
|
|||||||
Why would you throw a std::string?
|
Why would you throw a std::string?
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 204 | 151 passed | 49 failed | 4 failed as expected
|
test cases: 205 | 152 passed | 49 failed | 4 failed as expected
|
||||||
assertions: 1061 | 933 passed | 107 failed | 21 failed as expected
|
assertions: 1063 | 935 passed | 107 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -102,6 +102,30 @@ Misc.tests.cpp:<line number>
|
|||||||
Misc.tests.cpp:<line number>:
|
Misc.tests.cpp:<line number>:
|
||||||
PASSED:
|
PASSED:
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#1238
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Compilation.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( std::memcmp(uarr, "123", sizeof(uarr)) == 0 )
|
||||||
|
with expansion:
|
||||||
|
0 == 0
|
||||||
|
with messages:
|
||||||
|
uarr := "123"
|
||||||
|
sarr := "456"
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( std::memcmp(sarr, "456", sizeof(sarr)) == 0 )
|
||||||
|
with expansion:
|
||||||
|
0 == 0
|
||||||
|
with messages:
|
||||||
|
uarr := "123"
|
||||||
|
sarr := "456"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
#748 - captures with unexpected exceptions
|
#748 - captures with unexpected exceptions
|
||||||
outside assertions
|
outside assertions
|
||||||
@ -8935,6 +8959,6 @@ Misc.tests.cpp:<line number>:
|
|||||||
PASSED:
|
PASSED:
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 204 | 138 passed | 62 failed | 4 failed as expected
|
test cases: 205 | 139 passed | 62 failed | 4 failed as expected
|
||||||
assertions: 1075 | 933 passed | 121 failed | 21 failed as expected
|
assertions: 1077 | 935 passed | 121 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -102,6 +102,30 @@ Misc.tests.cpp:<line number>
|
|||||||
Misc.tests.cpp:<line number>:
|
Misc.tests.cpp:<line number>:
|
||||||
PASSED:
|
PASSED:
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
#1238
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Compilation.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( std::memcmp(uarr, "123", sizeof(uarr)) == 0 )
|
||||||
|
with expansion:
|
||||||
|
0 == 0
|
||||||
|
with messages:
|
||||||
|
uarr := "123"
|
||||||
|
sarr := "456"
|
||||||
|
|
||||||
|
Compilation.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( std::memcmp(sarr, "456", sizeof(sarr)) == 0 )
|
||||||
|
with expansion:
|
||||||
|
0 == 0
|
||||||
|
with messages:
|
||||||
|
uarr := "123"
|
||||||
|
sarr := "456"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
#748 - captures with unexpected exceptions
|
#748 - captures with unexpected exceptions
|
||||||
outside assertions
|
outside assertions
|
||||||
@ -308,6 +332,6 @@ with expansion:
|
|||||||
!true
|
!true
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 12 | 9 passed | 1 failed | 2 failed as expected
|
test cases: 13 | 10 passed | 1 failed | 2 failed as expected
|
||||||
assertions: 35 | 28 passed | 4 failed | 3 failed as expected
|
assertions: 37 | 30 passed | 4 failed | 3 failed as expected
|
||||||
|
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuitesloose text artifact
|
<testsuitesloose text artifact
|
||||||
>
|
>
|
||||||
<testsuite name="<exe-name>" errors="17" failures="105" tests="1076" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
<testsuite name="<exe-name>" errors="17" failures="105" tests="1078" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||||
<testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1147" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1147" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1175 - Hidden Test" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1175 - Hidden Test" time="{duration}"/>
|
||||||
|
<testcase classname="<exe-name>.global" name="#1238" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}">
|
<testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}">
|
||||||
<error type="TEST_CASE">
|
<error type="TEST_CASE">
|
||||||
expected exception
|
expected exception
|
||||||
|
@ -96,6 +96,37 @@
|
|||||||
<TestCase name="#1175 - Hidden Test" tags="[.]" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
<TestCase name="#1175 - Hidden Test" tags="[.]" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="#1238" filename="projects/<exe-name>/UsageTests/Compilation.tests.cpp" >
|
||||||
|
<Info>
|
||||||
|
uarr := "123"
|
||||||
|
</Info>
|
||||||
|
<Info>
|
||||||
|
sarr := "456"
|
||||||
|
</Info>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Compilation.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
std::memcmp(uarr, "123", sizeof(uarr)) == 0
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
0 == 0
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Info>
|
||||||
|
uarr := "123"
|
||||||
|
</Info>
|
||||||
|
<Info>
|
||||||
|
sarr := "456"
|
||||||
|
</Info>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Compilation.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
std::memcmp(sarr, "456", sizeof(sarr)) == 0
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
0 == 0
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<OverallResult success="true"/>
|
||||||
|
</TestCase>
|
||||||
<TestCase name="#748 - captures with unexpected exceptions" tags="[!shouldfail][!throws][.][failing]" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
<TestCase name="#748 - captures with unexpected exceptions" tags="[!shouldfail][!throws][.][failing]" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
||||||
<Section name="outside assertions" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
<Section name="outside assertions" filename="projects/<exe-name>/UsageTests/Exception.tests.cpp" >
|
||||||
<Info>
|
<Info>
|
||||||
@ -9882,7 +9913,7 @@ loose text artifact
|
|||||||
</Section>
|
</Section>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
<OverallResults successes="933" failures="122" expectedFailures="21"/>
|
<OverallResults successes="935" failures="122" expectedFailures="21"/>
|
||||||
</Group>
|
</Group>
|
||||||
<OverallResults successes="933" failures="121" expectedFailures="21"/>
|
<OverallResults successes="935" failures="121" expectedFailures="21"/>
|
||||||
</Catch>
|
</Catch>
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#include "catch.hpp"
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
namespace { namespace CompilationTests {
|
namespace { namespace CompilationTests {
|
||||||
|
|
||||||
#ifndef COMPILATION_TEST_HELPERS_INCLUDED // Don't compile this more than once per TU
|
#ifndef COMPILATION_TEST_HELPERS_INCLUDED // Don't compile this more than once per TU
|
||||||
@ -134,4 +136,15 @@ namespace { namespace CompilationTests {
|
|||||||
REQUIRE(t1 >= t2);
|
REQUIRE(t1 >= t2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// unsigned array
|
||||||
|
TEST_CASE("#1238") {
|
||||||
|
unsigned char uarr[] = "123";
|
||||||
|
CAPTURE(uarr);
|
||||||
|
signed char sarr[] = "456";
|
||||||
|
CAPTURE(sarr);
|
||||||
|
|
||||||
|
REQUIRE(std::memcmp(uarr, "123", sizeof(uarr)) == 0);
|
||||||
|
REQUIRE(std::memcmp(sarr, "456", sizeof(sarr)) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace CompilationTests
|
}} // namespace CompilationTests
|
||||||
|
Loading…
Reference in New Issue
Block a user