Commit Graph

9191 Commits

Author SHA1 Message Date
Benjamin Gilbert
b7203e9406 build: Drop redundant install_tag arguments for headers
All supported versions of Meson will autodetect the tag.
2024-09-11 22:04:39 -07:00
Emmanuele Bassi
0630b8145d Collation keys are not encoded in UTF-8
The value returned when generating a collation key is an opaque binary
blob that is only meant to be used for byte-wise comparisons; we should
not imply it's a nul-terminated, UTF-8 string.

This is especially true for language bindings that try to convert C
strings returned by GLib into UTF-8 encoded strings.

Ideally, the collation functions should return a byte array, but the
closest thing we have is the OS native encoding type that we use for
paths and environment variables.

See: https://github.com/gtk-rs/gtk-rs-core/issues/1504
2024-09-09 16:58:38 +01:00
Matthias Clasen
5d986fd42a dir: Avoid some allocations
If no error is passed, we don't need to do charset conversions.
2024-09-06 10:49:31 -04:00
Michael Catanzaro
ddeb4a211b gspawn: close child_err_report_fd before exiting on error
When the child process is going to exit on error after fork() but before
exec(), let's close the child_err_report_fd. The practical value of this
is to placate valgrind --track-fds=yes.
2024-08-30 11:42:12 -05:00
Christian Hergert
6ad7bcfc36 refstring: add GEqualFunc for ref-counted strings
This is the same as g_str_equal() except that it will first check the
string length for equality before dereferencing string contents.
2024-08-27 11:36:21 +01:00
Philip Withnall
aec5785e7b
gthread: Move thread _impl functions to static inlines for speed
The changes made in commit bc59e28bf6
(issue #3399) fixed introspection of the GThread API. However, they
introduced a trampoline in every threading function. So with those
changes applied, the disassembly of `g_mutex_lock()` (for example) was:
```
0x7ffff7f038b0 <g_mutex_lock>    jmp 0x7ffff7f2f440 <g_mutex_lock_impl>
0x7ffff7f038b5                   data16 cs nopw 0x0(%rax,%rax,1)
```

i.e. It jumps straight to the `_impl` function, even with an optimised
build. Since `g_mutex_lock()` (and various other GThread functions) are
frequently run hot paths, this additional `jmp` to a function which has
ended up in a different code page is a slowdown which we’d rather avoid.

So, this commit reworks things to define all the `_impl` functions as
`G_ALWAYS_INLINE static inline` (which typically expands to
`__attribute__((__always_inline__)) static inline`), and to move them
into the same compilation unit as `gthread.c` so that they can be
inlined without the need for link-time optimisation to be enabled.

It makes the code a little less readable, but not much worse than what
commit bc59e28bf6 already did. And perhaps
the addition of the `inline` decorations to all the `_impl` functions
will make it a bit clearer what their intended purpose is
(platform-specific implementations).

After applying this commit, the disassembly of `g_mutex_lock()`
successfully contains the inlining for me:
```
=> 0x00007ffff7f03d80 <+0>:	xor    %eax,%eax
   0x00007ffff7f03d82 <+2>:	mov    $0x1,%edx
   0x00007ffff7f03d87 <+7>:	lock cmpxchg %edx,(%rdi)
   0x00007ffff7f03d8b <+11>:	jne    0x7ffff7f03d8e <g_mutex_lock+14>
   0x00007ffff7f03d8d <+13>:	ret
   0x00007ffff7f03d8e <+14>:	jmp    0x7ffff7f03610 <g_mutex_lock_slowpath>
```

I considered making a similar change to the other APIs touched in #3399
(GContentType, GAppInfo, GSpawn), but they are all much less performance
critical, so it’s probably not worth making their code more complex for
that sake.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Fixes: #3417
2024-08-25 21:56:14 +01:00
Luca Bacci
84c2d64436 docs: Don't reference Unix-only method GLib.Source.add_unix_fd
gi-docgen won't find the method on Windows
2024-08-23 15:57:13 +02:00
LI Daobing
0ad7709c22 issue 3428: fix comment in escape_string 2024-08-20 18:24:33 -07:00
Philip Withnall
84728d4e01
tests: Move alternate stack onto the heap rather than the main stack
And size it to `sysconf (_SC_MINSIGSTKSZ)`, if defined.

This might fix the sigaltstack test on muslc, as suggested by Markus
Wichmann (https://www.openwall.com/lists/musl/2024/05/30/2) and Rich Felker
(https://www.openwall.com/lists/musl/2024/05/29/7) on the musl mailing
list.

The thinking is that the CI machine might have a huge register file
(AVX512 or some other large extension) which doesn’t fit in `MINSIGSTKSZ`.
By sizing the alternate stack to `sysconf (_SC_MINSIGSTKSZ)` we should
be able to avoid that.

Moving it onto the heap should avoid any potential complications or bugs
from having one stack embedded within another.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Fixes: #3315
2024-08-16 14:27:25 +01:00
Adrien Plazas
46ec058d2a ghash: Fix the documentation of GHRFunc
This function type isn't only used by g_hash_table_foreach_remove(), and
what happens to the data when we return TRUE depends on the calling
function.

Includes a port to modern gi-docgen syntax by Emmanuele Bassi.

Signed-off-by: Adrien Plazas <adrien.plazas@codethink.co.uk>
2024-08-15 10:22:07 +00:00
Philip Withnall
ab616db01e Merge branch 'wip/3v1n0/ci-really-use-fedora-39' into 'main'
ci: Ignore lcov errors on source missing, handle atomic writes and actually use Fedora 39 image

Closes #3381

See merge request GNOME/glib!4096
2024-08-14 14:58:36 +00:00
Michael Catanzaro
d9b2d097b4 Merge branch 'gstring-free-unused-result' into 'main'
gstring: fix unused-result warning with g_string_free() in C++

See merge request GNOME/glib!4182
2024-08-14 13:34:30 +00:00
Philip Withnall
dfe5e15a0a Merge branch 'use-tap-14' into 'main'
gtestutils: Use TAP 14 syntax by default

Closes #2885

See merge request GNOME/glib!4178
2024-08-14 13:27:04 +00:00
Luke T. Shumaker
9f6afbdb33 docs: g_regex_match_all: Remove a stray ";" in an example regex 2024-08-13 15:19:21 -06:00
Luke T. Shumaker
e4a2aa8f39 docs: Wrap things that gi-docgen mistakes as HTML tags in backticks
This are nasty, because they mean words get dropped from the
documentation.  This can be seen at

 - https://docs.gtk.org/gio/ctor.DBusNodeInfo.new_for_xml.html where
   it reads "one top-level element" instead of "one top-level <node>
   element".

 - https://docs.gtk.org/gio/method.ProxyResolver.lookup.html where it
   reads "where could be" instead of "where <protocol> could be".

 - https://docs.gtk.org/gio/method.Socket.get_option.html where it
   reads "[][gio-gnetworking.h]" instead of
   "[<gio/gnetworking.h>][gio-gnetworking.h" (also, this markdown link
   needs fixed, but let's save that for another commit).

 - https://docs.gtk.org/glib/ctor.DateTime.new_from_iso8601.html where
   the text is incomprehensible; "strings of the form are supported"
   instead of "strings of the form <date><sep><time><tz> are
   supported"; further references to <sep>, <date>, <time>, and <tz>
   are similarly mangled.

 - https://docs.gtk.org/glib/method.MatchInfo.fetch_named.html and
   https://docs.gtk.org/glib/method.MatchInfo.fetch_named_pos.html
   where the regex reads as "(?Pa)?b" instead of as "(?P<X>a)?b",
   changing the meaning of it.

 - https://docs.gtk.org/glib/method.Regex.match_all_full.html is all
   wack because the "<a>" in the example string is taken to be an HTML
   link; and all example strings and regexes are mangled (also, one of
   the regexes has a stray ";" in it, but let's save that for another
   commit).

 - https://docs.gtk.org/glib/method.Regex.replace.html where it simply
   reads "\g" instead of "\g<number>" and "\g<name>".

Fix those.
2024-08-13 15:19:21 -06:00
Luke T. Shumaker
d0b59da656 docs: Transition remaining DocBook XML to markdown/HTML
These remaining DocBook tags are mostly harmless; they are passed as
HTML5 tags to the browser, which effectively treats them as just
<span> elements, so all this mistake is doing is dropping some
styling.

This lack of of styling can be seen at:

 - https://docs.gtk.org/gio/enum.DriveStartStopType.html "ATA SECURITY
   UNLOCK DEVICE" is not indicated to be a quote or anything.

 - https://docs.gtk.org/gio/struct.UnixMountEntry.html "/media/cdrom"
   is not rendered in monospace.

 - https://docs.gtk.org/gio/struct.UnixMountPoint.html "/dev" is not
   rendered in monospace.

 - https://docs.gtk.org/glib/type_func.Thread.init.html the notes are
   not indicated to be anything other than regular paragraphs.

Fix that.
2024-08-13 15:19:14 -06:00
Michael Catanzaro
c2078021cb Merge branch 'gvariant-copy-free-func' into 'main'
GVariant: Add copy-func and free-func annotations

See merge request GNOME/glib!4161
2024-08-10 13:52:00 +00:00
Thomas Haller
f6cf2bcfd2 ghash: fix g_hash_table_steal_extended() when requesting key and value of a set
GHashTable optimizes for the "set" case, where key and value are the same.
See g_hash_table_add().

A user cannot see from outside, whether a GHashTable internally is a set
and shares the keys and values array. Adding one key/value pair with
differing key and value, will expand the GHashTable.

In all other cases, the GHashTable API hides this implementation detail
correctly. Except with g_hash_table_steal_extended(), when stealing both the
key and the value.

Fix that. This bug fix is obviously a change in behavior. In practice,
it's unlikely that somebody would notice, because GHashTable contains
opaque pointers and the user must know what the keys/values are and
be aware of their ownership semantics when stealing them. That means,
the change in behavior only affects instances that are internally a set,
of what the user most likely is aware and fills the table with
g_hash_table_add(). Such a user would not steal both the key and
values at the same time. Even if they do, then previously stealing the
value was pointless and would not give them what they wanted. It would
not have meaningfully worked, and since nobody reported a bug about this
yet, it's unlikely somebody noticed.

The more problematic case when the user exhibits the bug is when the
dictionary is unexpected a set internally. Imagine a mapping from numbers
to numbers (e.g. a permutation). If "unexpectedly" the dictionary contains
the identity permutation, steal-extended gives always NULL for the target
number.

The example is far fetched. In practice, it's unlikely that somebody is
gonna notice either way. That is not an argument for fixing anything.
The argument for fixing this, is that the bug breaks the illusion that
the set is only an internal optimization. That is ugly and inconsistent.
2024-08-09 19:24:08 +02:00
Thomas Haller
600dd1a8a9 ghash/tests: add test cases for g_hash_table_steal_extended() for a set 2024-08-09 19:23:13 +02:00
Michael Catanzaro
f8b230f593 Merge branch 'gbytes-copy-free-func' into 'main'
GBytes: Add copy-func and free-func annotations

See merge request GNOME/glib!4162
2024-08-09 16:08:41 +00:00
Michael Catanzaro
804f6de450 Merge branch 'nielsdg/gmain-gi-docgen' into 'main'
gmain: Adapt to gi-docgen comments

See merge request GNOME/glib!4177
2024-08-09 15:44:32 +00:00
Olivier Blin
dd62ad57d9 gstring: fix unused-result warning with g_string_free() in C++
Some g++ versions issue an unused-result warning for the g_string_free() macro:

error: ignoring return value of 'gchar* g_string_free_and_steal(GString*)',
declared with attribute warn_unused_result [-Werror=unused-result]
    g_string_free(s, TRUE);

This occurs with gcc 6.x / 7.1 / 7.2, and it is fixed in gcc 7.3.
2024-08-07 15:57:20 +02:00
Christian Hergert
fab6595562 glib/mappedfile: g_mapped_file_get_contents() does not transfer
This fixes the annoations for g_mapped_file_get_contents() which looks
like it might transfer ownership (due to being a char*) but does not as
we're pointing into the mmap() region.
2024-08-02 14:20:36 -07:00
Marco Trevisan (Treviño)
05d81f03f6 gtestutils: Use TAP 14 syntax by default
The issue of meson 60 have been resolved for some time now, so we can
just use newer TAP syntax safely.

Revert "gtestutils: Use TAP 13 comments syntax for subtests"
This reverts commit e8725407bcd35c1fa8fed92250edf080d5542b3c.

Closes: #2885
2024-08-02 09:36:53 +02:00
Marco Trevisan (Treviño)
b2c5092bf1 glib/tests/unix: Free fds before exiting
Old valgrind wasn't spotting this but we're smarter now!
2024-08-02 03:39:48 +02:00
Niels De Graef
10d4edea2e gmain: Adapt to gi-docgen comments
Now that we've switched to `gi-docgen`, let's make sure our docs are
getting updated. This commit fixes most of the previous gtk-doc
references so that they now follow gi-docgen syntax.

Some exceptions are functions or types that are referenced, but are
generated by a higher level layer like `Gio`, `GObject` or `Gtk`.
2024-08-01 18:38:57 +02:00
Simon McVittie
e807966b84 strfuncs: Don't let get_C_locale() clobber errno
Some callers of `g_ascii_strtoull()` and similar functions assume that
they can use this pattern, similar to what they might do for
Standard C `strtoull()`:

    errno = 0;
    result = g_ascii_strtoull (nptr, endptr, base);
    saved_errno = errno;

    if (saved_errno != 0)
      g_printerr ("error parsing %s\n", nptr);

This is based on the fact that it is non-trivial to tell whether
`strtoull()` and related functions succeeded (in which case the value
of `errno` is unspecified) or failed (in which case `errno` is valid).
For example, POSIX `strtoul(3)` suggests this pattern:

> Since 0, `ULONG_MAX`, and `ULLONG_MAX` are returned on error and are
> also valid returns on success, an application wishing to check for
> error situations should set `errno` to 0, then call `strtoul()` or
> `strtoull()`, then check `errno`.

However, `g_ascii_strtoull()` does not *only* call a function resembling
`strtoull()` (`strtoull_l()` or its reimplementation
`g_parse_long_long()`): it also calls `get_C_locale()`, which wraps
`newlocale()`. Even if `newlocale()` succeeds (which in practice we
expect and assume that it will), it is valid for it to clobber `errno`.
For example, it might attempt to open a file that only conditionally
exists, which would leave `errno` set to `ENOENT`.

This is difficult to reproduce in practice: I encountered what I
believe to be this bug when compiling GLib-based software for i386 in a
Debian 12 derivative via an Open Build Service instance, but I could
not reproduce the bug in a similar chroot environment locally, and I
also could not reproduce the bug when compiling for x86_64 or for a
Debian 10, 11 or 13 derivative on the same Open Build Service instance.
It also cannot be reproduced via the GTest framework, because
`g_test_init()` indirectly calls `g_ascii_strtoull()`, resulting in
the call to `newlocale()` already having happened by the time we enter
test code.

Resolves: https://gitlab.gnome.org/GNOME/glib/-/issues/3418
Signed-off-by: Simon McVittie <smcv@collabora.com>
2024-07-26 13:08:27 +01:00
Philip Withnall
bc59e28bf6
gthread: Make introspection comments platform-independent
Move various doc/introspection comments from `gthread-posix.c` (which is
platform-specific) to `gthread.c` (which is not). Having the
introspection annotations and doc comments in a platform-independent
file means that they are seen by the build process on all platforms, and
we don’t end up with unintrospectable APIs on some platforms, or
platform-specific annotation differences.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3399
2024-07-24 16:47:47 +02:00
Philip Withnall
435aeddbc7 Merge branch '3399-glib-gir-platform-differences' into 'main'
gspawn: Move docs/annotations to be platform independent

See merge request GNOME/glib!4158
2024-07-24 09:18:58 +00:00
Sebastian Wick
363f5ebafc gmacros: Define G_STATIC_ASSERT for GI Scanner
Using G_STATIC_ASSERT in headers which are introspected currently
requires guarding them behind `#ifndef __GI_SCANNER__` which is really
annoying. We can just define the macros to be noops in a way that the
scanner doesn't trip over them.

Signed-off-by: Sebastian Wick <sebastian.wick@redhat.com>
2024-07-23 12:25:35 +02:00
Sebastian Wick
88da3a718d gmacros: Define G_PASTE/G_PASTE_ARGS for GI Scanner
They are guarded for the GI Scanner right now even though they should be
fine to expose and they are used in macros that are not guarded for the
GI Scanner.

Signed-off-by: Sebastian Wick <sebastian.wick@redhat.com>
2024-07-23 12:19:32 +02:00
badcel
9add21edfc
GBytes: Add copy-func and free-func annotations 2024-07-19 17:09:57 +02:00
badcel
eadd0736ee
GVariant: Add copy-func and free-func annotations 2024-07-19 16:32:49 +02:00
Philip Withnall
a931a75c4f docs(GNode): Traversal diagrams, color & dark-mode
* Create a dark-mode variant of each traversal diagram, with the
  traversal path colorized `--primary` blue, instead of the original
  black.
* Apply the same colorizations to the light-mode diagrams, but
  using the light-theme `--primary` blue.
* Add SPDX license/copyright comments to all eight SVG files.
* Add new files to documentation configs in `glib.toml.in`.
* Update documentation comment in `gnode.c` to embed both color
  variants via picture tags, instead of markdown image embeds.
* Add alt text to all four images.
* Add additional blank lines to documentation comment, so that
  a. First item in bulleted list does not get folded into
     preceding intro paragraph
  b. Intro paragraph and diagrams are not part of first paragraph
     in documentation. (This also gets them out of the top-level
     table-of-contents/index list, where they previously appeared
     in full.)
* (Accidental change I didn't realize I was making): Convert line
  endings in breadth-first diagram from CRLF to LF.
2024-07-15 15:58:45 +00:00
Philip Withnall
6161bbf3e4
gspawn: Add platform-independent top level API file
This file doesn’t contain any real implementation, it just call the
`impl` functions from the platform-specific files
`gspawn-{posix,win32}.c`.

It serves as a location for the doc comments, introspection annotations
and API preconditions, and will be built on every platform. In
particular, this means that we get consistent GIR output for the
`g_spawn_*()` APIs regardless of whether GLib was built on Linux or
Windows.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3399
2024-07-15 16:40:55 +01:00
Philip Withnall
b6c12c61f3
gspawn: Rename gspawn.c to gspawn-posix.c
This is the first step towards separating the API documentation and
introspection annotations from the platform-specific implementation, so
we can guarantee that the APIs make it into `GLib-2.0.gir` regardless of
which platform the GIR is built on.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3399
2024-07-15 16:04:51 +01:00
Philip Withnall
8bf5873272 Merge branch 'bilelmoussaoui-main-patch-13638' into 'main'
gi: Add missing Since annotation

See merge request GNOME/glib!4144
2024-07-09 22:08:49 +00:00
Bilal Elmoussaoui
a31479316d gi: Add missing Since annotation
Fixes b32e1b63ee
2024-07-09 20:16:20 +01:00
Christoph Reiter
a49815926c glib-private: fix build under Cygwin
fb58d55187 added weak linking for ASAN,
skipping it for MinGW because weak symbols are broken there.
The same is true for Cygwin, so skip things there too.

This fixes the following build error under MSYS2:

/usr/lib/gcc/x86_64-pc-msys/13.3.0/../../../../x86_64-pc-msys/bin/ld:
    glib/msys-glib-2.0-0.dll.p/gutils.c.o:gutils.c:
        (.rdata$.refptr.__lsan_enable[.refptr.__lsan_enable]+0x0): undefined reference to `__lsan_enable'
2024-07-09 20:34:02 +02:00
Philip Withnall
f24bb8dc19
gutilsprivate: Factor out g_isnan() helper
There are a couple of places in the code which use `isnan()` and have
platform-specific workarounds for it. Unify those, and extend the
workaround to work for msys2-mingw32.

It seems that msys2-mingw32 can’t automatically use `isnan()` in a wider
mode than `float`:
```
In file included from ../glib/gdatetime.c:60:
../glib/gdatetime.c: In function 'g_date_time_new':
../glib/gdatetime.c:1648:14: error: conversion from 'gdouble' {aka 'double'} to 'float' may change value [-Werror=float-conversion]
 1648 |       isnan (seconds) ||
      |              ^~~~~~~
cc1.exe: all warnings being treated as errors
```

See: https://gitlab.gnome.org/pwithnall/glib/-/jobs/4022715

Using it in float mode on all platforms should not change behaviour, as
a conversion from `(double) NAN` to `float` should still give `NAN`.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-07-07 17:53:19 +01:00
Philip Withnall
7878938e9a Merge branch 'pr/fix_some_windows_testsuite_failures' into 'main'
tests: fix some Windows testsuite failures

Closes #3370

See merge request GNOME/glib!4125
2024-07-04 19:35:47 +00:00
Benoit Pierre
caf7f8ef49 tests: fix some Windows testsuite failures
Add test dependencies on the 2 spawn helpers required on Windows.
2024-07-04 19:35:47 +00:00
Philip Withnall
b29f249544 Merge branch 'async_queue_copy_free_func' into 'main'
GAsyncQueue: Add copy-func and free-func annotations

See merge request GNOME/glib!4131
2024-07-04 13:11:31 +00:00
Philip Withnall
70784b99b1 Merge branch 'wsign-conversion' into 'main'
gqsort: Add g_sort_array() and deprecate g_qsort_with_data()

See merge request GNOME/glib!4127
2024-07-04 12:33:38 +00:00
Gary Li
964abbd07d gmain: Refactor GSourceFuncs into typed callbacks
Refactor and document them into typed callbacks, which is preferred over older gtk-doc descriptions for function pointer fields.

Fixes https://gitlab.gnome.org/GNOME/glib/-/issues/2765
2024-07-04 10:40:20 +00:00
badcel
2ebcff9349
GAsyncQueue: Add copy-func and free-func annotations 2024-06-30 21:32:33 +02:00
Philip Withnall
4d31fe6b7d
gnulib: Disable -Wfloat-conversion by default
gnulib doesn’t work with it, and if we try and enable it then mingw
versions of `signbit()` start causing problems.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-06-28 16:34:08 +01:00
Philip Withnall
7b435dfa7c
garray: Fix g_ptr_array_insert() with indices > G_MAXINT
While an index greater than `G_MAXINT` can’t be passed to
`g_ptr_array_insert()`, `-1` can be — and if that’s done with an array
which has more than `G_MAXINT` elements in it, the new element will be
inserted part-way through the array rather than being appended.

Spotted by building with `-Wsign-conversion`.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-06-28 15:27:25 +01:00
Philip Withnall
b32e1b63ee
gqsort: Add g_sort_array() and deprecate g_qsort_with_data()
The latter only accepts a `gint` as the number of elements in the array,
which means that its use in `GArray` (and related array implementations)
truncates at least half the potential array size.

So, introduce a replacement for it which uses `size_t` for the number of
elements. This is inline with what `qsort()` (or `qsort_r()`) actually
does. Unfortunately we can’t directly use `qsort_r()` because it’s not
guaranteed to be a stable sort.

This fixes some `-Wsign-conversion` warnings (when building GLib with
that enabled).

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-06-28 15:27:18 +01:00
Philip Withnall
b69fe111ec
tests: Use a correct-typed constant in gdatetime tests
This makes no functional changes, but does avoid a warning from
`-Wfloat-conversion` due to implicitly switching from `guint64` to
`gdouble` and then back to `guint64`.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-06-28 14:34:04 +01:00
Philip Withnall
412aed7c70
gtestutils: Add some explicit double casts
This avoids some false positive warnings from `-Wfloat-conversion`.

The code in `gtestutils.c` is a bit odd: it uses an array of `long
double` elements, with specific indices of that array storing specific
meaningful numbers, each of which has a type which is representable as a
`long double`, but which actually isn’t.

This is a prime candidate for refactoring to not use such a type-unsafe
API where everything is marshalled through `long double`. Unfortunately,
the array is declared in `GTestLogMsg`, which is defined in the public
`gtestutils.h` header, so we can’t change it. Boo.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-06-28 14:31:18 +01:00
Philip Withnall
2713255574
glib: Add explicit casts for some double → other numeric type conversions
If we enable `-Wfloat-conversion`, these warn about a possible loss of
precision due to an implicit conversion from `double` to some other
numeric type.

The warning is correct: there is a possible loss of precision here. In
these instances, we don’t care, as the floating point arithmetic is
being done to do some imprecise scaling or imprecise timing. A loss of
precision is not a problem.

So, add an explicit cast to squash the warning.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3405
2024-06-28 14:24:55 +01:00
Philip Withnall
e2a36f8b05 Merge branch 'free' into 'main'
gtestutils: Free test_data when freeing a test case

See merge request GNOME/glib!4120
2024-06-26 12:45:05 +00:00
Akihiko Odaki
0e994ead0f gtestutils: Free test_data when freeing a test case
Commit 9dad94e7q ensured `test_data` is freed when a test is skipped,
but didn't ensure that when a whole test suite is skipped.

We are assuming the ownership of `test_data` is passed to GTestCase
with `g_test_add_data_func_full()` so free `test_data` always when
freeing a test case.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
2024-06-26 20:02:18 +09:00
Akihiko Odaki
328d996fbe gmacros: Avoid casting functions
gmacros.h casts functions to GDestroyNotify, which prevents enabling the
following hardening options in applications: -fsanitize=address
-fsanitize=cfi-icall (without -fsanitize-cfi-icall-generalize-pointers),
and -Wcast-function-type-strict.

Define another inline function that warps the original function into
GDestroyNotify.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
2024-06-26 19:59:55 +09:00
Benjamin Otte
a57f0b190a array: Abort on overflow
This is a precautionary assert that will probably only trigger on 32bit
OSes. But g_nearest_pow() can overflow.
2024-06-17 11:51:00 +01:00
Emmanuele Bassi
5697c11f1f docs: Update toolchain requirement to C11
We have required C99 for a while; in the meantime, most C toolchains
have moved on to C11 or later as the default C standard.

We still allow for C99 toolchains, but in the future we are going to
require a C11 toolchain to build and use GLib.
2024-06-14 12:35:21 +01:00
Simon McVittie
7efb96d29b glib-init: Statically assert that types have appropriate signedness
Some of these are properties of a Standard C or POSIX platform that
are true by definition and checked for completeness (for example intptr_t
is defined to be signed, and uintptr_t unsigned), while others are
checking that GLib's type detection has been done correctly.

Signed-off-by: Simon McVittie <smcv@debian.org>
2024-06-04 16:57:18 +01:00
Simon McVittie
a0ed94a11d Provide private G_SIGNEDNESS_OF macro in glib-private.h
Signed-off-by: Simon McVittie <smcv@debian.org>
2024-06-04 16:57:18 +01:00
Tanmay Patil
37333d63d6 docs: Fix docs reference to main-loop
Signed-off-by: Tanmay Patil <tanmaynpatil105@gmail.com>
2024-05-28 14:27:43 +05:30
Chun-wei Fan
3f11a55983 gmem.c: Update g_clear_pointer() documentation 2024-05-24 10:16:51 +00:00
Philip Withnall
6187d40a0f
tests: Fix compilation failure on macOS due to missing include
It’s needed for the `symlink()` function.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-05-24 09:52:55 +01:00
Philip Withnall
60845fce0a Merge branch 'dont-rm-rf-root' into 'main'
gtestutils: Don't follow symlinks when deleting tests' tempdir

Closes #3290

See merge request GNOME/glib!4018
2024-05-23 23:08:39 +00:00
Will Thompson
56c6e28c68 Test that isolate-dirs doesn't follow symlinks during cleanup 2024-05-23 23:01:32 +01:00
Will Thompson
dc97423ead Test cleaning up unreadable temporary test directory
Neither the new nftw()-based rm_rf() implementation, nor the fallback
implementation, should fail the test if there is an error during cleanup
of the directory tree. And the output on stderr that the nftw()-based
implementation emits should not interfere with Meson parsing the TAP
stream on stdout.

The test is run in a subprocess so that we can clean up after ourselves.
2024-05-23 23:01:32 +01:00
Philip Withnall
31c85d3985 Merge branch 'gpattern-docs' into 'main'
gpattern: Port the docs to gi-docgen syntax

See merge request GNOME/glib!4081
2024-05-23 09:55:32 +00:00
Philip Withnall
d6abaf7921
gpattern: Port the docs to gi-docgen syntax
And make a few formatting fixes.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3250
2024-05-23 10:36:50 +01:00
Will Thompson
5f6dda5bdc gtestutils: Don't follow symlinks when deleting tests' tempdir
Previously, when cleaning up the temporary directory tree created by
passing G_TEST_OPTION_ISOLATE_DIRS, any symbolic links in that tree
would be followed recursively. If the test case has created a symbolic
link in its temporary directory to a directory outside that tree, this
could lead to unexpected data loss; in particular, if the test case
author has (unwisely) created a symbolic link to /, they could lose all
data on the system.

On systems that have the ftw.h header, replace the current rm_rf()
implementation with one that uses nftw() to perform a depth-first
traversal (FTW_DEPTH) without following symbolic links (FTW_PHYS), and
without crossing mount points (FTW_MOUNT) in case a test has mounted
some other filesystem in the temporary directory.

The callback logs any error to the standard error stream, but returns 0
rather than -1 to allow nftw() to keep walking the tree rather than
terminating immediately. Suppose we are trying to clean up the following
tree:

    tmpdir/
      a/
        f/ (directory not readable for some reason)
        g/
          p
      b/
        c
        d

Since tmpdir/a/f is not readable, we can expect to fail to delete
tmpdir/a/f, tmpdir/a and tmpdir; but it is preferable to (attempt) to
delete the rest of the tree rather than failing outright. The cost is
that three errors will be logged (for tmpdir/a/f, tmpdir/a and tmpdir).

nftw() is part of POSIX.1-2001, SUSv1, and glibc ≥ 2.1, so should be
available on effectively every platform except Windows. (And Windows
does not enable symbolic links by default so the developer error is less
likely to occur there.)

The macOS ftw(3) manpage says:

> These functions are provided for compatibility with legacy code.  New
> code should use the fts(3) functions.

fts(3) does not seem to be part of any standard, but it does seem to be
equally widely supported. The Linux manpages do not indicate that
nftw() is deprecated.

Fixes: https://gitlab.gnome.org/GNOME/glib/-/issues/3290
2024-05-22 22:43:42 +01:00
Emmanuele Bassi
11157ca936 build: Use override_options for C standard selection
Do not try to inject the C standard into `c_args`: Meson already
generates a compiler command line with the appropriate C standard, and
adding another one into it at a random position is either potentially
undefined behaviour, or it's going to break the build because the
compiler does not accept more than one switch.

Meson has an `override_options` argument for the executable() object,
and we are already using it in places.
2024-05-22 17:05:03 +01:00
Emmanuele Bassi
db419ffbde Revert "Alias TRUE and FALSE to C99's true and false"
This reverts commit 67d89a5a87.

Turns out that C++ doesn't like it when stuff goes from an integer to a
boolean.

See: https://gitlab.gnome.org/GNOME/gnome-build-meta/-/merge_requests/2900
2024-05-21 21:56:04 +01:00
Jan Tojnar
701412530b gstrfuncs: Remove g_strescape docs from the header
They are not visible in the API reference with gi-docgen.
2024-05-18 23:34:20 +02:00
Jan Tojnar
c167562b38 docs: Describe g_strcompress processing
GVariant Text Format section on bytestrings links to `g_strcompress`
but what it does was only briefly described in the header file,
which is not visible in the gi-docgen-built reference. To really
find out one would have to guess to continue through the rabbit hole
to `g_strescape`.

Let’s merge the description from the header and elaborate on it a bit.
2024-05-18 23:31:59 +02:00
Jan Tojnar
4acedc8669 docs: Improve g_strescape description wording
Saying that it inserts a backslash before special character is incorrect
for anything but a double quote and backslash itself. Instead, it replaces
the special characters with a C escape sequence.

Let’s fix that and also make it less C focused by using Unicode names
of the characters instead of assuming everyone knows C escape sequences
by heart.
2024-05-18 23:00:21 +02:00
Jan Tojnar
275330009a docs: Fix g_strescape rendering escape sequences
In the gi-docgen Markdown flavour, \' will just prevent the apostrophe
from turning into a curly single quote.
2024-05-18 22:55:58 +02:00
Michael Catanzaro
1bbf500fb8 Merge branch 'wip/pwithnall/clang-discarded-qualifiers' into 'main'
tests: Fix clang compilation failure due to unrecognised option in pragma

See merge request GNOME/glib!4078
2024-05-16 16:29:27 +00:00
Philip Withnall
4d2e0df9ee Merge branch 'ebassi/c99-boolean-constants' into 'main'
Alias TRUE and FALSE to C99's true and false

Closes #3326

See merge request GNOME/glib!4001
2024-05-16 12:50:08 +00:00
Philip Withnall
3be537a2a8
tests: Fix clang compilation failure due to unrecognised option in pragma
Sigh.

```
../glib/tests/atomic.c:139:32: error: unknown warning group '-Wdiscarded-qualifiers', ignored [-Werror,-Wunknown-warning-option]
\#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
                               ^
1 error generated.
```

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-05-16 12:50:57 +01:00
Emmanuele Bassi
34626188aa Merge branch 'fix-mp_limb_t-size' into 'main'
Fix several GCC 14 warnings to please msys2-mingw32 CI

See merge request GNOME/glib!4066
2024-05-15 10:52:14 +00:00
Philip Withnall
375076fb81
tests: Fix transposed arguments to g_aligned_alloc()
Spotted by GCC 14’s `-Werror=calloc-transposed-args`. Thanks, GCC 14.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-05-15 10:51:50 +01:00
Philip Withnall
edf1fd9fb3
tests: Ignore -Wdiscarded-qualifiers with volatile atomics tests
GCC 14 now emits this warning with the tests:
```
In file included from ../glib/gthread.h:34,
                 from ../glib/gasyncqueue.h:34,
                 from ../glib/glib.h:34,
                 from ../glib/tests/atomic.c:14:
../glib/tests/atomic.c: In function 'test_types':
../glib/gatomic.h:140:5: error: argument 2 of '__atomic_store' discards 'volatile' qualifier [-Werror=discarded-qualifiers]
  140 |     __atomic_store (gaps_temp_atomic, &gaps_temp_newval, __ATOMIC_SEQ_CST); \
      |     ^~~~~~~~~~~~~~
../glib/tests/atomic.c:139:3: note: in expansion of macro 'g_atomic_pointer_set'
  139 |   g_atomic_pointer_set (&vp_str_vol, NULL);
      |   ^~~~~~~~~~~~~~~~~~~~
cc1.exe: all warnings being treated as errors
```

I can’t think of a way to cast around this in the definition of
`g_atomic_pointer_set()` without making the behaviour worse (less type
safe) for modern non-volatile atomic variables.

We would like to strongly nudge users of GLib away from declaring atomic
variables as `volatile`, so letting another compiler warning be emitted
when they do is not the end of the world. As long as it doesn’t stop old
code compiling (without `-Werror`).

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-05-15 10:33:35 +01:00
Marco Trevisan (Treviño)
cbc5808545 vsaprintf: Use proper size for mp_limb_t to please msys2-mingw32 CI 2024-05-11 01:25:12 +02:00
Marco Trevisan (Treviño)
f9cb8d59de glib/tests/mapping: Unref the mapped file on exit 2024-05-10 04:16:17 +02:00
Marco Trevisan (Treviño)
1d2d865f47 glib/tests/mapping: Check the exit status of the child process
In this way if it fails for some memory error we can track it
2024-05-10 04:16:17 +02:00
Marco Trevisan (Treviño)
f7b1ed1bf3 glib/tests/1bit-emufutex: Mark it as failing under ASAN 2024-05-10 04:16:17 +02:00
Marco Trevisan (Treviño)
d22e96aa72 glib/tests/assert-msg-test.py: Skip the GDB test under sanitizers 2024-05-10 04:16:17 +02:00
Marco Trevisan (Treviño)
aab0ff201b glib/tests/build: Support setting env variables for python tests 2024-05-10 02:44:07 +02:00
Marco Trevisan (Treviño)
8032ba88d6 glib/tests/gutils-user-database: Ensure the test run under ASAN
It uses LD_PRELOAD that may break asan, so let's ignore asan load order
for now, even though that implies a partial test
2024-05-10 02:44:07 +02:00
Marco Trevisan (Treviño)
d544d409cb glib/tests/gutils-user-database: Add test dependency on preload library
We do preload the library but that's not set as test dependency and so
it may not be built
2024-05-09 17:51:10 +02:00
Marco Trevisan (Treviño)
19d7040047 glib/tests/unicode: Cleanup allocated old locale if tests is skipped 2024-05-09 17:51:08 +02:00
Marco Trevisan
3fca627241 Merge branch 'wip/3v1n0/valgrind-ignore-alternate-stack-contents-check' into 'main'
glib/tests/unix: Do not perform stack memory checks under valgrind

Closes #3337

See merge request GNOME/glib!4050
2024-05-09 14:54:46 +00:00
Marco Trevisan (Treviño)
5aafaa0cc9 glib/tests/constructor: Add test dependency on constructor_lib
Otherwise we may build the test but not its dependent library
2024-05-09 15:48:32 +02:00
Marco Trevisan (Treviño)
c894e89720 glib/tests/unix: Do not perform stack memory checks under valgrind
When running the alternate stack tests under valgrind the stack memory
gets corrupted that we've initialized gets somehow corrupted and this
causes a read-error while reading the stack memory area.

No matter if we use instead malloc-allocated or mmap'ed memory areas,
the result is always the same: a memory error while reading it.

  Reading byte 2645
  Reading byte 2646
  Reading byte 2647
  Reading byte 2648
  ==46100== Invalid read of size 1

Now this memory is definitely stack-allocated and unless the valgrind
stack gets corrupted, there's no way it could have been removed.

I quite trust that this is some valgrind problem only though since no
other memory analyzer I've tried (memory sanitizer mostly) has
highlighted any issue with this.

As per this, since the main point of the test was just checking if
signals are delivered properly even when using an alternate stack, I
think that we can just safely run a simpler version of the test when
running under valgrind. This implies assuming that sigaltstack()
does what is supposed to do, without us double-checking it, but I guess
we can trust that (especially because we're still testing it when not
using valgrind).

Closes: #3337
2024-05-09 15:42:32 +02:00
Fabrice Fontaine
4e6dc4dee0 link with -latomic when needed
Some architecture such as sparc and some flavors of arm needs -latomic
to avoid the following build failure:

gthread-posix.c:(.text+0xda8): undefined reference to `__atomic_compare_exchange_4'

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2024-05-02 17:54:52 +02:00
Philip Withnall
e12e81a02d
gdatetime: Fix string type used to initialise array
This fixes commit 057f0fcbfb. I didn’t
notice that `tmp` is an array of strings, not an array of chars, and
somehow my compiler didn’t warn. Seems only the macOS CI job is spotting
the problem here.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-04-26 10:28:47 +01:00
Philip Withnall
b1bafda881
gvariant: Simplify GVariantType check in g_variant_format_string_scan_type()
Rather than returning through `G_VARIANT_TYPE`, which scan-build doesn’t
seem to fully understand ownership transfers through, just return `new`
directly, and do the `is_valid()` check separately.

The new code is equivalent to the old code, but squashes a scan-build
false positive around leaking `dest`. (See also: the previous commit.)

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #1767
2024-04-25 23:58:30 +01:00
Philip Withnall
156c1496ba
gvariant: Rework array iteration in g_variant_format_string_scan_type()
This introduces no functional changes. Switch from incrementing a
pointer to incrementing a counter and using array indexing.

This squashes a scan-build false positive, where it can’t choose which
of `dest` and `new` ‘own’ the newly allocated memory, so it kind of
assumes both do, and then warns there’s a potential leak of `dest` when
the function returns. In actual fact, ownership of the memory is
returned via `new`.

Partly this might be masked through use of the `G_VARIANT_TYPE` macro,
which the following commit will address.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #1767
2024-04-25 23:58:23 +01:00
Philip Withnall
79be995c0c
gtimezone: Add a missing precondition assertion
Otherwise scan-build thinks there could be `NULL` pointer dereference of
the `tz`. (There can’t be, it’s a false positive. 🤫)

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #1767
2024-04-25 23:58:18 +01:00
Philip Withnall
2d5fc78f63
gtestutils: Add an assertion to squash a scan-build false positive
scan-build thinks there’s a potential `NULL` pointer dereference of some
of the members of `msg->strings`, because it doesn’t know about the
implicit invariant that the length of `msg->strings` is
`msg->n_strings`.

Ideally we want an assertion like `g_assert (g_strv_length
(msg->strings) == msg->n_strings)`, but that’s not very performant, so
just settle for a non-`NULL` assertion on each loop iteration to give
scan-build the hint it needs.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #1767
2024-04-25 23:58:13 +01:00
Philip Withnall
cf940496df
ghostutils: Add a missing precondition check to g_hostname_to_unicode()
This helps out scan-build, which otherwise thinks there could be a
`NULL` pointer dereference.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #1767
2024-04-25 23:58:08 +01:00
Philip Withnall
057f0fcbfb
gdatetime: Fix a maybe-uninitialized warning
scan-build thinks that `tmp` can be dereferenced before it’s all been
assigned to. I don’t think that’s the case, because the number of
elements in it which have been assigned to is tracked as `i`. But static
analysers find that kind of state tracking hard to reason about, so
let’s just zero-initialise the array to simplify things.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #1767
2024-04-25 23:58:04 +01:00