Skip to content

Commit bc4fd55

Browse files
peffgitster
authored andcommitted
find_last_dir_sep(): convert inline function to macro
The find_last_dir_sep() function is implemented as an inline function which takes in a "const char *" and returns a "char *" via strrchr(). That means that just like strrchr(), it quietly removes the const from our pointer, which could lead to accidentally writing to the resulting string. But C23 versions of libc (including recent glibc) annotate strrchr() such that the compiler can detect when const is implicitly lost, and it now complains about the call in this inline function. We can't just switch the return type of the function to "const char *", though. Some callers really do want a non-const string to be returned (and are OK because they are feeding a non-const string into the function). The most general solution is for us to annotate find_last_dir_sep() in the same way that is done for strrchr(). But doing so relies on using C23 generics, which we do not otherwise require. Since this inline function is wrapping a single call to strrchr(), we can take a shortcut. If we implement it as a macro, then the original type information is still available to strrchr(), and it does the check for us. Note that this is just one implementation of find_last_dir_sep(). There is an alternate implementation in compat/win32/path-utils.h. It doesn't suffer from the same warning, as it does not use strrchr() and just casts away const explicitly. That's not ideal, and eventually we may want to conditionally teach it the same C23 generic trick that strrchr() uses. But it has been that way forever, and our goal here is just quieting new warnings, not improving const-checking. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 21c57ef commit bc4fd55

1 file changed

Lines changed: 1 addition & 5 deletions

File tree

git-compat-util.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,7 @@ static inline int is_path_owned_by_current_uid(const char *path,
335335
#endif
336336

337337
#ifndef find_last_dir_sep
338-
static inline char *git_find_last_dir_sep(const char *path)
339-
{
340-
return strrchr(path, '/');
341-
}
342-
#define find_last_dir_sep git_find_last_dir_sep
338+
#define find_last_dir_sep(path) strrchr((path), '/')
343339
#endif
344340

345341
#ifndef has_dir_sep

0 commit comments

Comments
 (0)