Tue, 04 Oct 2022 19:25:07 +0200
fix over-optimization of strstr
1. it's actually less performant to frequently read bytes
from an array instead of using the native word length
2. the SBO buffer should be local and not static to allow
multi-threading usage
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | #include "cx/allocator.h" |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
30 | #include <gtest/gtest.h> |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
31 | |
513
b66532b5d8db
do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents:
511
diff
changeset
|
32 | TEST(Allocator, DefaultAllocator) { |
397
cfc1193b1e65
removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents:
396
diff
changeset
|
33 | cx_allocator_class *clazz = cxDefaultAllocator->cl; |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
34 | ASSERT_NE(clazz, nullptr); |
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
35 | } |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
36 | |
513
b66532b5d8db
do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents:
511
diff
changeset
|
37 | TEST(Allocator, DefaultMalloc) { |
397
cfc1193b1e65
removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents:
396
diff
changeset
|
38 | void *test = cxMalloc(cxDefaultAllocator, 16); |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
39 | ASSERT_NE(test, nullptr); |
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
40 | free(test); |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
41 | } |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
42 | |
513
b66532b5d8db
do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents:
511
diff
changeset
|
43 | TEST(Allocator, DefaultRealloc) { |
397
cfc1193b1e65
removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents:
396
diff
changeset
|
44 | void *test = calloc(8, 1); |
421
aa465fac4ef6
fix reallocate_null test not used and wrong
Mike Becker <universe@uap-core.de>
parents:
419
diff
changeset
|
45 | memcpy(test, "Test", 5); |
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
46 | test = cxRealloc(cxDefaultAllocator, test, 16); |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
47 | ASSERT_NE(test, nullptr); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
48 | EXPECT_STREQ(reinterpret_cast<char *>(test), "Test"); |
414 | 49 | free(test); |
50 | } | |
51 | ||
513
b66532b5d8db
do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents:
511
diff
changeset
|
52 | TEST(Allocator, Reallocate) { |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
53 | void *test = calloc(8, 1); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
54 | memcpy(test, "Test", 5); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
55 | int ret = cxReallocate(cxDefaultAllocator, &test, 16); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
56 | EXPECT_EQ(ret, 0); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
57 | ASSERT_NE(test, nullptr); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
58 | EXPECT_STREQ(reinterpret_cast<char *>(test), "Test"); |
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
59 | free(test); |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
60 | } |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
61 | |
513
b66532b5d8db
do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents:
511
diff
changeset
|
62 | TEST(Allocator, DefaultCalloc) { |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
63 | char *test = reinterpret_cast<char *>(cxCalloc(cxDefaultAllocator, 8, 2)); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
64 | ASSERT_NE(test, nullptr); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
65 | for (int i = 0; i < 16; i++) ASSERT_EQ(test[i], 0); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
66 | free(test); |
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
67 | } |
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
68 | |
513
b66532b5d8db
do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents:
511
diff
changeset
|
69 | TEST(Allocator, DefaultFree) { |
511
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
70 | void *test = malloc(16); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
71 | EXPECT_NO_FATAL_FAILURE( |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
72 | cxFree(cxDefaultAllocator, test); |
a32e6a6b1ca7
migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents:
443
diff
changeset
|
73 | ); |
391
f094a53c1178
adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
74 | } |
514
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
75 | |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
76 | TEST(Allocator, FailingReallocate) { |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
77 | // Mock an allocator that always returns nullptr on realloc |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
78 | cx_allocator_class mock_cl; |
522
b91c50d023f4
add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents:
514
diff
changeset
|
79 | mock_cl.realloc = []( |
b91c50d023f4
add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents:
514
diff
changeset
|
80 | [[maybe_unused]]void *p, |
b91c50d023f4
add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents:
514
diff
changeset
|
81 | [[maybe_unused]]void *d, |
b91c50d023f4
add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents:
514
diff
changeset
|
82 | [[maybe_unused]]size_t n |
b91c50d023f4
add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents:
514
diff
changeset
|
83 | ) -> void * { return nullptr; }; |
514
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
84 | cx_allocator_s mock{&mock_cl, nullptr}; |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
85 | |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
86 | void *test = calloc(8, 1); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
87 | memcpy(test, "Test", 5); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
88 | void *original = test; |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
89 | int ret = cxReallocate(&mock, &test, 16); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
90 | // non-zero return code because of the failure |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
91 | EXPECT_NE(ret, 0); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
92 | // the test pointer was not changed and still points to the same memory |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
93 | EXPECT_EQ(test, original); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
94 | EXPECT_STREQ(reinterpret_cast<char *>(test), "Test"); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
95 | free(test); |
6f9d97a53d67
test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents:
513
diff
changeset
|
96 | } |