On 2026-05-30 Paul Eggert did:
> 2026-05-30 Paul Eggert <[email protected]>
>
> + free-posix: remove stray wchar-h dependency
> + * modules/free-posix (Depends-on): Don’t depend on wchar-h.
> + Discovered because gzip unnecessarily brought in wchar-h machinery.
This change is a regression. It causes bogus -Wmismatched-dealloc warnings
to appear in a program that
- uses the 'free-posix' module,
- does not use the 'wcsdup' or 'wchar-h' modules,
- uses the 'wcsdup' function,
- is built on a platform where an rpl_free function is needed,
- is built with gcc 11.
How to reproduce the problem:
1. Create three testdirs:
$ ./gnulib-tool --create-testdir --dir=../testdir3 --avoid=string-h free-posix
$ ./gnulib-tool --create-testdir --dir=../testdir4 free-posix
$ ./gnulib-tool --create-testdir --dir=../testdir5 free-posix wchar-h
2, Build each one:
$ gl_cv_func_free_preserves_errno=no ./configure; make
3. Compile the attached program that uses strdup() and wcsdup():
$ gcc-11.5.0 -O2 -Wall -Wmismatched-dealloc foo.c \
-I/GNULIB/testdir3 -I/GNULIB/testdir3/gllib /GNULIB/testdir3/gllib/libgnu.a
etc.
Results:
* In testdir3, which has no built string.h nor wchar.h file, there are
bogus warnings about strdup and wcsdup:
$ gcc-version 11.5.0 -O2 -Wall -Wmismatched-dealloc foo.c \
-I/GNULIB/testdir3 -I/GNULIB/testdir3/gllib /GNULIB/testdir3/gllib/libgnu.a
In file included from foo.c:3:
foo.c: In function ‘main’:
foo.c:12:5: warning: ‘rpl_free’ called on pointer returned from a mismatched
allocation function [-Wmismatched-dealloc]
12 | free (s);
| ^
foo.c:10:15: note: returned from ‘strdup’
10 | char *s = strdup ("foo");
| ^~~~~~~~~~~~~~
In file included from foo.c:3:
foo.c:17:5: warning: ‘rpl_free’ called on pointer returned from a mismatched
allocation function [-Wmismatched-dealloc]
17 | free (s);
| ^
foo.c:15:18: note: returned from ‘wcsdup’
15 | wchar_t *s = wcsdup (L"foo");
| ^~~~~~~~~~~~~~~
* In testdir4, which has a built string.h but no built wchar.h file, there is
a bogus warning about wcsdup:
$ gcc-version 11.5.0 -O2 -Wall -Wmismatched-dealloc foo.c \
-I/GNULIB/testdir4 -I/GNULIB/testdir4/gllib /GNULIB/testdir4/gllib/libgnu.a
In file included from foo.c:3:
foo.c: In function ‘main’:
foo.c:17:5: warning: ‘rpl_free’ called on pointer returned from a mismatched
allocation function [-Wmismatched-dealloc]
17 | free (s);
| ^
foo.c:15:18: note: returned from ‘wcsdup’
15 | wchar_t *s = wcsdup (L"foo");
| ^~~~~~~~~~~~~~~
* In testdir5, which has a built string.h and wchar.h, no bogus warnings
appear:
$ gcc-version 11.5.0 -O2 -Wall -Wmismatched-dealloc foo.c \
-I/GNULIB/testdir5 -I/GNULIB/testdir5/gllib /GNULIB/testdir5/gllib/libgnu.a
Note: I don't get any -Wmismatched-dealloc warnings in this test case
with gcc versions >= 12, but I think this is a consequence of a gcc bug:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126172 .
Paul: Your motivation for this patch was to avoid a wchar.h in the gzip build.
Assuming that gzip does not use the wcsdup() function, the right fix for gzip
is to use the gnulib-tool option '--avoid=wchar-h' (in bootstrap.conf).
2026-07-08 Bruno Haible <[email protected]>
free-posix: Fix bogus -Wmismatched-dealloc warnings (regr. 2026-05-30).
* modules/free-posix (Depends-on): Add back wchar-h.
diff --git a/modules/free-posix b/modules/free-posix
index 703fb7db89..317f48bafd 100644
--- a/modules/free-posix
+++ b/modules/free-posix
@@ -9,6 +9,7 @@ m4/musl.m4
Depends-on:
stdlib-h
string-h
+wchar-h
configure.ac:
gl_FUNC_FREE
#include <config.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
int main ()
{
{
char *s = strdup ("foo");
s[1] = 'x';
free (s);
}
{
wchar_t *s = wcsdup (L"foo");
s[1] = L'x';
free (s);
}
return 0;
}