Pádraig Brady wrote:
>
>     maint: suppress some clang scan-build warnings
>
>     * src/pr.c (char_to_clump): Remove a dead store.
>     * src/remove.c (fts_skip_tree): Likewise.
>     * src/sort.c (key_warnings): Likewise.
>     (sort): Suppress an uninitialized pointer warning.

Thanks!  That is fine, with one correction below.

I hope clang's analysis improves to the point
that we can make coreutils warning-free without too much effort.
I noticed that this warning about ln.c is bogus:

    203 && (backup_type == no_backups || !symbolic_link)
    204 && (!symbolic_link || stat (source, &source_stats) == 0)
    205 && SAME_INODE (source_stats, dest_stats)

      Within the expansion of the macro 'SAME_INODE':
      The left operand of '==' is a garbage value

Here's the expansion:
         ((source_stats).st_ino == (dest_stats).st_ino &&
          (source_stats).st_dev == (dest_stats).st_dev)

The problem is that clang made the assumption, a few lines above,
that "symbolic_link" was true, yet doesn't deduce the consequence:
whenever SAME_INODE is reached, the just-prior call to stat has
succeeded, and hence has defined "source_stats".

...
> diff --git a/src/sort.c b/src/sort.c
...
> @@ -3770,6 +3770,7 @@ sort (char *const *files, size_t nfiles, char const 
> *output_file,
>        size_t nthreads)
>  {
>    struct buffer buf;
> +  IF_LINT (buf.buf == NULL);

ETOOLATE ;-)  You must mean this:

    IF_LINT (buf.buf = NULL);

Reply via email to