@@ -0,0 +1,252 @@
|
|||||||
|
From b67d508a93bf1ba231c18dce3894cfee25c16e0d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stephen Webb <swebb@blackberry.com>
|
||||||
|
Date: Wed, 12 Feb 2025 12:08:07 -0500
|
||||||
|
Subject: [PATCH] Fix bad prototype for malloc() in test
|
||||||
|
|
||||||
|
The unit test Gtest-nomalloc.c had an incorrect prototype for malloc()
|
||||||
|
which caused newer compilers to fail compiling for newer C editions.
|
||||||
|
|
||||||
|
Corrected the prototype and corrected a few other errors. The unit now
|
||||||
|
compiles using GCC with `CFLAGS=-Wall -Wextra -pedantic -C11` with no
|
||||||
|
warnings, which is the minimum requirement.
|
||||||
|
|
||||||
|
Added the tests/unw_test.h header as a first step to cleaning up some
|
||||||
|
unit tests further.
|
||||||
|
---
|
||||||
|
tests/Gtest-nomalloc.c | 124 +++++++++++++++++++++++------------------
|
||||||
|
tests/Makefile.am | 2 +-
|
||||||
|
tests/unw_test.h | 47 ++++++++++++++++
|
||||||
|
3 files changed, 117 insertions(+), 56 deletions(-)
|
||||||
|
create mode 100644 tests/unw_test.h
|
||||||
|
|
||||||
|
diff --git a/tests/Gtest-nomalloc.c b/tests/Gtest-nomalloc.c
|
||||||
|
index 5b97fc709..e770ff614 100644
|
||||||
|
--- a/tests/Gtest-nomalloc.c
|
||||||
|
+++ b/tests/Gtest-nomalloc.c
|
||||||
|
@@ -1,78 +1,92 @@
|
||||||
|
-/* libunwind - a platform-independent unwind library
|
||||||
|
- Copyright (C) 2009 Google, Inc
|
||||||
|
- Contributed by Arun Sharma <arun.sharma@google.com>
|
||||||
|
+/**
|
||||||
|
+ * @file tests/Gtest-nomalloc.c
|
||||||
|
+ *
|
||||||
|
+ * Verify that @c malloc() is not called during an unwinding operation.
|
||||||
|
+ */
|
||||||
|
+/*
|
||||||
|
+ * This file is part of libunwind.
|
||||||
|
+ * Copyright 2025 Stephen M. Webb <stephen.webb@bregmasoft.ca>
|
||||||
|
+ * Copyright (C) 2009 Google, Inc
|
||||||
|
+ * Contributed by Arun Sharma <arun.sharma@google.com>
|
||||||
|
+ *
|
||||||
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
+ * of this software and associated documentation files (the "Software"), to
|
||||||
|
+ * deal in the Software without restriction, including without limitation the
|
||||||
|
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
+ * sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
+ * furnished to do so, subject to the following conditions:
|
||||||
|
+ *
|
||||||
|
+ * The above copyright notice and this permission notice shall be included in
|
||||||
|
+ * all copies or substantial portions of the Software.
|
||||||
|
+ *
|
||||||
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
+ * IN THE SOFTWARE.
|
||||||
|
+ */
|
||||||
|
|
||||||
|
-Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
-a copy of this software and associated documentation files (the
|
||||||
|
-"Software"), to deal in the Software without restriction, including
|
||||||
|
-without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
-distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
-permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
-the following conditions:
|
||||||
|
-
|
||||||
|
-The above copyright notice and this permission notice shall be
|
||||||
|
-included in all copies or substantial portions of the Software.
|
||||||
|
-
|
||||||
|
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||||
|
-
|
||||||
|
-#include <unistd.h>
|
||||||
|
-#include <stdio.h>
|
||||||
|
-#include <stdlib.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <libunwind.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
|
||||||
|
-#define panic(args...) \
|
||||||
|
- { fprintf (stderr, args); exit (-1); }
|
||||||
|
+#include "unw_test.h"
|
||||||
|
|
||||||
|
-int verbose;
|
||||||
|
-int num_errors;
|
||||||
|
+int malloc_call_count;
|
||||||
|
int in_unwind;
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * Intercepted malloc() call.
|
||||||
|
+ *
|
||||||
|
+ * If invoked during unwinding this call will increment the test error count
|
||||||
|
+ * and indicate a failure by returning NULL. Otherwise it just calls the real
|
||||||
|
+ * malloc().
|
||||||
|
+ */
|
||||||
|
void *
|
||||||
|
-malloc(size_t s)
|
||||||
|
+malloc (size_t sz)
|
||||||
|
{
|
||||||
|
- static void * (*func)();
|
||||||
|
+ typedef void *(*malloc_t) (size_t);
|
||||||
|
|
||||||
|
- if(!func)
|
||||||
|
- func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
|
||||||
|
+ static malloc_t real_malloc = NULL;
|
||||||
|
+ if (real_malloc == NULL)
|
||||||
|
+ {
|
||||||
|
+ real_malloc = (malloc_t)(intptr_t)dlsym (RTLD_NEXT, "malloc");
|
||||||
|
+ if (real_malloc == NULL)
|
||||||
|
+ {
|
||||||
|
+ fprintf (stderr, "no malloc() found\n");
|
||||||
|
+ exit (UNW_TEST_EXIT_HARD_ERROR); \
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (in_unwind) {
|
||||||
|
- num_errors++;
|
||||||
|
- return NULL;
|
||||||
|
- } else {
|
||||||
|
- return func(s);
|
||||||
|
- }
|
||||||
|
+ if (in_unwind)
|
||||||
|
+ {
|
||||||
|
+ malloc_call_count++;
|
||||||
|
+ }
|
||||||
|
+ return real_malloc (sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_backtrace (void)
|
||||||
|
{
|
||||||
|
- unw_word_t ip, sp;
|
||||||
|
- unw_cursor_t cursor;
|
||||||
|
+ unw_cursor_t cursor;
|
||||||
|
unw_context_t uc;
|
||||||
|
- int ret;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
in_unwind = 1;
|
||||||
|
unw_getcontext (&uc);
|
||||||
|
if (unw_init_local (&cursor, &uc) < 0)
|
||||||
|
- panic ("unw_init_local failed!\n");
|
||||||
|
+ {
|
||||||
|
+ fprintf (stderr, "unw_init_local failed!\n");
|
||||||
|
+ exit (UNW_TEST_EXIT_HARD_ERROR); \
|
||||||
|
+ }
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
- unw_get_reg (&cursor, UNW_REG_IP, &ip);
|
||||||
|
- unw_get_reg (&cursor, UNW_REG_SP, &sp);
|
||||||
|
-
|
||||||
|
ret = unw_step (&cursor);
|
||||||
|
- if (ret < 0)
|
||||||
|
- {
|
||||||
|
- ++num_errors;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
while (ret > 0);
|
||||||
|
in_unwind = 0;
|
||||||
|
@@ -99,12 +113,12 @@ foo1 (void)
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
- foo1();
|
||||||
|
+ foo1 ();
|
||||||
|
|
||||||
|
- if (num_errors > 0)
|
||||||
|
+ if (malloc_call_count > 0)
|
||||||
|
{
|
||||||
|
- fprintf (stderr, "FAILURE: detected %d errors\n", num_errors);
|
||||||
|
- exit (-1);
|
||||||
|
+ fprintf (stderr, "FAILURE: malloc called %d times, expected 0\n", malloc_call_count);
|
||||||
|
+ exit (UNW_TEST_EXIT_FAIL);
|
||||||
|
}
|
||||||
|
- return 0;
|
||||||
|
+ exit (UNW_TEST_EXIT_PASS);
|
||||||
|
}
|
||||||
|
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||||
|
index adc34ac63..60f3f3adc 100644
|
||||||
|
--- a/tests/Makefile.am
|
||||||
|
+++ b/tests/Makefile.am
|
||||||
|
@@ -214,7 +214,7 @@ endif
|
||||||
|
|
||||||
|
noinst_PROGRAMS = $(noinst_PROGRAMS_common) $(noinst_PROGRAMS_cdep) \
|
||||||
|
$(noinst_PROGRAMS_arch)
|
||||||
|
-noinst_HEADERS = ident.h
|
||||||
|
+noinst_HEADERS = ident.h unw_test.h
|
||||||
|
|
||||||
|
do_test_subst = sed -e 's,[@]TESTS[@],$(TESTS),g' \
|
||||||
|
-e 's,[@]XFAIL_TESTS[@],$(XFAIL_TESTS),g' \
|
||||||
|
diff --git a/tests/unw_test.h b/tests/unw_test.h
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000..9ae86dce1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tests/unw_test.h
|
||||||
|
@@ -0,0 +1,47 @@
|
||||||
|
+/**
|
||||||
|
+ * @file tests/unw_test.h
|
||||||
|
+ *
|
||||||
|
+ * Common unit test API for libunwind.
|
||||||
|
+ */
|
||||||
|
+/*
|
||||||
|
+ * This file is part of libunwind.
|
||||||
|
+ * Copyright 2025 Stephen M. Webb <stephen.webb@bregmasoft.ca>
|
||||||
|
+ *
|
||||||
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
+ * of this software and associated documentation files (the "Software"), to
|
||||||
|
+ * deal in the Software without restriction, including without limitation the
|
||||||
|
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||||
|
+ * sell copies of the Software, and to permit persons to whom the Software is
|
||||||
|
+ * furnished to do so, subject to the following conditions:
|
||||||
|
+ *
|
||||||
|
+ * The above copyright notice and this permission notice shall be included in
|
||||||
|
+ * all copies or substantial portions of the Software.
|
||||||
|
+ *
|
||||||
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
+ * IN THE SOFTWARE.
|
||||||
|
+ */
|
||||||
|
+#ifndef LIBUNWIND_UNW_TEST_H
|
||||||
|
+#define LIBUNWIND_UNW_TEST_H 1
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Exit values for test programs.
|
||||||
|
+ * Based on https://www.gnu.org/software/automake/manual/html_node/Scripts_002dbased-Testsuites.html
|
||||||
|
+ *
|
||||||
|
+ * These are used to interact with the test harness (eg. a TAP-based harness,
|
||||||
|
+ * CTest, or automake).
|
||||||
|
+ */
|
||||||
|
+enum {
|
||||||
|
+ UNW_TEST_EXIT_PASS = 0, /* Item under test is a PASS */
|
||||||
|
+ UNW_TEST_EXIT_FAIL = 1, /* Item under test is a FAIL */
|
||||||
|
+ UNW_TEST_EXIT_BAD_COMMAND = 2, /* Test program is invoked with invalid arguments */
|
||||||
|
+ UNW_TEST_EXIT_SKIP = 77, /* Test should be skipped */
|
||||||
|
+ UNW_TEST_EXIT_HARD_ERROR = 99 /* Test program itself has failed */
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+#endif /* LIBUNWIND_UNW_TEST_H */
|
||||||
|
+
|
||||||
@@ -12,10 +12,13 @@
|
|||||||
<IsA>library</IsA>
|
<IsA>library</IsA>
|
||||||
<Summary>Call chain tracer of a program</Summary>
|
<Summary>Call chain tracer of a program</Summary>
|
||||||
<Description>libunwind is a portable and efficient C programming interface (API) to determine the call chain of a program.</Description>
|
<Description>libunwind is a portable and efficient C programming interface (API) to determine the call chain of a program.</Description>
|
||||||
<Archive sha1sum="5c061a408d4b196dcb97212c819179a9983194ab" type="targz">https://github.com/libunwind/libunwind/releases/download/v1.8.1/libunwind-1.8.1.tar.gz</Archive>
|
<Archive sha1sum="db8a09f488d628072cb67df3a6eb6fa224b0af5e" type="targz">https://github.com/libunwind/libunwind/releases/download/v1.8.2/libunwind-1.8.2.tar.gz</Archive>
|
||||||
<BuildDependencies>
|
<BuildDependencies>
|
||||||
<Dependency>xz-devel</Dependency>
|
<Dependency>xz-devel</Dependency>
|
||||||
</BuildDependencies>
|
</BuildDependencies>
|
||||||
|
<Patches>
|
||||||
|
<Patch level="1">b67d508a.patch</Patch>
|
||||||
|
</Patches>
|
||||||
</Source>
|
</Source>
|
||||||
|
|
||||||
<Package>
|
<Package>
|
||||||
@@ -61,6 +64,13 @@
|
|||||||
</Package>
|
</Package>
|
||||||
|
|
||||||
<History>
|
<History>
|
||||||
|
<Update release="13">
|
||||||
|
<Date>2025-11-06</Date>
|
||||||
|
<Version>1.8.2</Version>
|
||||||
|
<Comment>Version bump.</Comment>
|
||||||
|
<Name>Pisi Linux Community</Name>
|
||||||
|
<Email>admin@pisilinux.org</Email>
|
||||||
|
</Update>
|
||||||
<Update release="12">
|
<Update release="12">
|
||||||
<Date>2024-08-17</Date>
|
<Date>2024-08-17</Date>
|
||||||
<Version>1.8.1</Version>
|
<Version>1.8.1</Version>
|
||||||
|
|||||||
Reference in New Issue
Block a user