Files
nbnet/tests/string_tests.c
Volodymyr FialkoandBIAGINI Nathan 15d823dab6 Enable build flags and fix compilation warnings (gcc 14.1.0) (#66)
* Fix rpc build with other examples

CPP_COMPILE is an option, a cache variable, thus regular unset() is not
working for it since it tries to unset the scope variable.

This causing cmake to skip compilation of rpc.
Unset CPP_COMPILE from CACHE to make it work as intended.

* Fix compiler flags with build targets

Currently tests, soak and examples are build without extra flags,
because add_compile_options is specified after defining build targets.

From add_compile_options() docs:
Adds options to the compiler command line for targets in the current
directory and below that are added *after* this command is invoked.

* Pass debug callbacks as struct

Fixes:
warning: ISO C forbids conversion of function pointer to object pointer
type

* Move global variables under NBNET_IMPL

Nb net could be included multiple times, to prevent creation of global
variables in each file move them under NBNET_IMPL.

Also use designated initializer to initiate a driver structure to
remove warnings about partial initialization. Designated initializer
would initialize other members to zero.

* Resolve unused variables warnings.

Cast unused function arguments to (void) to suspend warnings.

* Resolve signed vs unsigned warnings

Remove unnecessary lt 0 checks and sync types to remove signed vs
unsigned warnings.

* Resolve string related warnings

Fixes:
nbnet/tests/string_tests.c:18:9: error: ‘strncpy’
output truncated before terminating nul copying 5 bytes from a string of
the same length
[-Werror=stringop-truncation]
   18 |         strncpy(res + pos, b, len_b);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

nbnet/tests/string_tests.c:24:9: error: ‘strncpy’
specified bound depends on the length of the source argument
[-Werror=stringop-truncation]

* Resolve function defined but not used warnings

Mark GameServer_GetClientCount() as inline.

* Attempt to fix warning in ASSERT_VALUE_IN_RANGE

In case when value in unsigned type and min is 0, this commit just
obfuscates types, maybe there's better solution.

Fixes:
warning: comparison of unsigned expression in ‘>= 0’ is always true
[-Wtype-limits]

* Ensure that read len is less than word size

In release mode(-DCMAKE_BUILD_TYPE=Release) tests returning following
error:
nbnet/tests/../nbnet.h:2272:9: error: ‘memcpy’ forming offset [4, 7] is
out of the bound s [0, 4] of object ‘word’ with type ‘Word’ {aka
‘unsigned int’} [-Werror=array-bounds=]
 2272 |         memcpy(bytes, &word, length); |
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

Add check to verify that length is less than Word size.

* add -Wno-unknown-pragmas flag

* fix examples compilation on windows

* fix examples compilation on windows

* fix examples compilation on windows

* fix unit tests compilation on windows

* fix soak test compilation on windows

* fix unit tests compilation on windows

* fix unit tests compilation on windows

---------

Co-authored-by: BIAGINI Nathan <nath.biagini@gmail.com>
2024-08-10 12:02:42 +02:00

63 lines
1.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "CuTest.h"
static void StringReplaceAll(char *res, const char *str, const char *a, const char *b)
{
char *substr = strstr(str, a);
size_t len_a = strlen(a);
size_t len_b = strlen(b);
if (substr)
{
int pos = substr - str;
memcpy(res, str, pos);
memcpy(res + pos, b, len_b);
StringReplaceAll(res + pos + len_b, str + pos + len_a, a, b);
}
else
{
memcpy(res, str, strlen(str) + 1);
}
}
void Test_StringReplaceAll(CuTest *tc)
{
const char *str = "foo bar plop foo plap test foo";
const char *str2 = "foo bar\nplop\n\nplap";
const char *str3 = "foo bar";
char res[128] = {0};
char res2[128] = {0};
char res3[16] = {0};
StringReplaceAll(res, str, "foo", "hello");
CuAssertStrEquals(tc, "hello bar plop hello plap test hello", res);
StringReplaceAll(res2, str2, "\n", "\\n");
CuAssertStrEquals(tc, "foo bar\\nplop\\n\\nplap", res2);
StringReplaceAll(res3, str3, "test", "aaaaa");
CuAssertStrEquals(tc, "foo bar", res3);
}
int main(int argc, char *argv[])
{
CuString *output = CuStringNew();
CuSuite* suite = CuSuiteNew();
(void) argc;
(void) argv;
SUITE_ADD_TEST(suite, Test_StringReplaceAll);
CuSuiteRun(suite);
CuSuiteSummary(suite, output);
CuSuiteDetails(suite, output);
printf("%s\n", output->buffer);
return suite->failCount;
}