diff --git a/doc/xml/release.xml b/doc/xml/release.xml
index 5dbd8fdb1..677aafaa3 100644
--- a/doc/xml/release.xml
+++ b/doc/xml/release.xml
@@ -68,6 +68,14 @@
Improve behavior of the repo-ls command.
+
+
+
+
+
+
+ Inline strPtr() to increase profiling accuracy.
+
diff --git a/src/common/io/tls/client.c b/src/common/io/tls/client.c
index e03f37100..f5c8894ef 100644
--- a/src/common/io/tls/client.c
+++ b/src/common/io/tls/client.c
@@ -104,7 +104,7 @@ tlsClientNew(SocketClient *socket, TimeMSec timeout, bool verifyPeer, const Stri
if (caFile != NULL || caPath != NULL) // {vm_covered}
{
cryptoError( // {vm_covered}
- SSL_CTX_load_verify_locations(this->context, strPtr(caFile), strPtr(caPath)) != 1, // {vm_covered}
+ SSL_CTX_load_verify_locations(this->context, strPtrNull(caFile), strPtrNull(caPath)) != 1, // {vm_covered}
"unable to set user-defined CA certificate location"); // {vm_covered}
}
// Else use the defaults
diff --git a/src/common/type/string.c b/src/common/type/string.c
index 77ef1eb05..395be89ad 100644
--- a/src/common/type/string.c
+++ b/src/common/type/string.c
@@ -695,7 +695,7 @@ strPathAbsolute(const String *this, const String *base)
/**********************************************************************************************************************************/
const char *
-strPtr(const String *this)
+strPtrNull(const String *this)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(STRING, this);
diff --git a/src/common/type/string.h b/src/common/type/string.h
index 935cedf70..af7d2cb0d 100644
--- a/src/common/type/string.h
+++ b/src/common/type/string.h
@@ -35,8 +35,25 @@ String object
***********************************************************************************************************************************/
typedef struct String String;
+#include "common/assert.h"
#include "common/type/buffer.h"
+/***********************************************************************************************************************************
+Fields that are common between dynamically allocated and constant strings
+
+There is nothing user-accessible here but this construct allows constant strings to be created and then handled by the same
+functions that process dynamically allocated strings.
+***********************************************************************************************************************************/
+#define STRING_COMMON \
+ uint64_t size:32; /* Actual size of the string */ \
+ uint64_t extra:32; /* Extra space allocated for expansion */ \
+ char *buffer; /* String buffer */
+
+typedef struct StringConst
+{
+ STRING_COMMON
+} StringConst;
+
/***********************************************************************************************************************************
Constructors
***********************************************************************************************************************************/
@@ -116,8 +133,19 @@ String *strPath(const String *this);
// Combine with a base path to get an absolute path
String *strPathAbsolute(const String *this, const String *base);
-// String pointer
-const char *strPtr(const String *this);
+// Pointer to zero-terminated string. strPtrNull() returns NULL when the String is NULL.
+__attribute__((always_inline)) static inline const char *
+strPtr(const String *this)
+{
+ // Avoid uncovered branch during coverage testing
+#ifndef DEBUG_COVERAGE
+ ASSERT(this != NULL);
+#endif
+
+ return ((const StringConst *)this)->buffer;
+}
+
+const char *strPtrNull(const String *this);
// Quote a string
String *strQuote(const String *this, const String *quote);
@@ -149,22 +177,6 @@ Destructor
***********************************************************************************************************************************/
void strFree(String *this);
-/***********************************************************************************************************************************
-Fields that are common between dynamically allocated and constant strings
-
-There is nothing user-accessible here but this construct allows constant strings to be created and then handled by the same
-functions that process dynamically allocated strings.
-***********************************************************************************************************************************/
-#define STRING_COMMON \
- uint64_t size:32; /* Actual size of the string */ \
- uint64_t extra:32; /* Extra space allocated for expansion */ \
- char *buffer; /* String buffer */
-
-typedef struct StringConst
-{
- STRING_COMMON
-} StringConst;
-
/***********************************************************************************************************************************
Macros for constant strings
diff --git a/test/src/common/harnessTest.h b/test/src/common/harnessTest.h
index b7e21db8d..8aba54ce5 100644
--- a/test/src/common/harnessTest.h
+++ b/test/src/common/harnessTest.h
@@ -239,13 +239,13 @@ Macros to compare results of common data types
TEST_RESULT_Z_PARAM(statement, expected, harnessTestResultOperationNe, __VA_ARGS__);
#define TEST_RESULT_STR(statement, resultExpected, ...) \
- TEST_RESULT_Z(strPtr(statement), strPtr(resultExpected), __VA_ARGS__);
+ TEST_RESULT_Z(strPtrNull(statement), strPtrNull(resultExpected), __VA_ARGS__);
#define TEST_RESULT_STR_Z(statement, resultExpected, ...) \
- TEST_RESULT_Z(strPtr(statement), resultExpected, __VA_ARGS__);
+ TEST_RESULT_Z(strPtrNull(statement), resultExpected, __VA_ARGS__);
#define TEST_RESULT_STR_Z_KEYRPL(statement, resultExpected, ...) \
- TEST_RESULT_Z(strPtr(statement), hrnReplaceKey(resultExpected), __VA_ARGS__);
+ TEST_RESULT_Z(strPtrNull(statement), hrnReplaceKey(resultExpected), __VA_ARGS__);
#define TEST_RESULT_Z_STR(statement, resultExpected, ...) \
- TEST_RESULT_Z(statement, strPtr(resultExpected), __VA_ARGS__);
+ TEST_RESULT_Z(statement, strPtrNull(resultExpected), __VA_ARGS__);
#define TEST_RESULT_UINT_PARAM(statement, expected, operation, ...) \
do \
diff --git a/test/src/module/common/typeStringTest.c b/test/src/module/common/typeStringTest.c
index 7b8541f65..8d2732ede 100644
--- a/test/src/module/common/typeStringTest.c
+++ b/test/src/module/common/typeStringTest.c
@@ -15,7 +15,7 @@ testRun(void)
FUNCTION_HARNESS_VOID();
// *****************************************************************************************************************************
- if (testBegin("strNew(), strNewBuf(), strNewN(), strEmpty(), strPtr(), strSize(), and strFree()"))
+ if (testBegin("strNew(), strNewBuf(), strNewN(), strEmpty(), strPtr(), strPtrNull(), strSize(), and strFree()"))
{
// We don't want this struct to grow since there are generally a lot of strings, so make sure it doesn't grow without us
// knowing about it
@@ -30,7 +30,7 @@ testRun(void)
TEST_RESULT_UINT(strSize(string), 13, "check size");
TEST_RESULT_BOOL(strEmpty(string), false, "is not empty");
TEST_RESULT_UINT(strlen(strPtr(string)), 13, "check size with strlen()");
- TEST_RESULT_INT(strPtr(string)[2], 'a', "check character");
+ TEST_RESULT_INT(strPtrNull(string)[2], 'a', "check character");
TEST_RESULT_VOID(strFree(string), "free string");
@@ -47,7 +47,7 @@ testRun(void)
// -------------------------------------------------------------------------------------------------------------------------
string = strNewFmt("formatted %s %04d", "string", 1);
TEST_RESULT_STR_Z(string, "formatted string 0001", "new with formatted string");
- TEST_RESULT_STR(NULL, NULL, "null string pointer");
+ TEST_RESULT_Z(strPtrNull(NULL), NULL, "null string pointer");
TEST_RESULT_VOID(strFree(string), "free string");
TEST_RESULT_VOID(strFree(NULL), "free null string");