Hello tech@,
I was stealing^W borrowing some code from scandir.c when I noticed some
warnings when compiling with -Wall -Wextra.
It's probably nitpicking, but wouldn't be better declare arraysz as
size_t instead of long? Or there is something that I'm missing and it
actually makes sense to keep it signed?
Here's more context on scandir.c:
60 int
61 scandir(const char *dirname, struct dirent ***namelist,
62 int (*select)(const struct dirent *),
63 int (*dcomp)(const struct dirent **, const struct dirent **))
64 {
65 struct dirent *d, *p, **names = NULL;
66 size_t nitems = 0;
67 struct stat stb;
68 long arraysz;
69 DIR *dirp;
...
76 /*
77 * estimate the array size by taking the size of the directory
file
78 * and dividing it by a multiple of the minimum size entry.
79 */
80 arraysz = MAXIMUM(stb.st_size / 24, 16);
81 if (arraysz > SIZE_MAX / sizeof(struct dirent *)) {
82 errno = ENOMEM;
83 goto fail;
84 }
85 names = calloc(arraysz, sizeof(struct dirent *));
...
89 while ((d = readdir(dirp)) != NULL) {
...
93 /*
94 * Check to make sure the array has space left and
95 * realloc the maximum size.
96 */
97 if (nitems >= arraysz) {
...
103 arraysz *= 2;
104 if (SIZE_MAX / sizeof(struct dirent *) <
arraysz)
105 goto fail;
106 nnames = reallocarray(names,
107 arraysz, sizeof(struct dirent *));
...
Thanks,
Omar Polo
Index: scandir.c
===================================================================
RCS file: /home/cvs/src/lib/libc/gen/scandir.c,v
retrieving revision 1.21
diff -u -p -r1.21 scandir.c
--- scandir.c 28 Jun 2019 13:32:41 -0000 1.21
+++ scandir.c 25 Apr 2021 10:39:15 -0000
@@ -63,9 +63,8 @@ scandir(const char *dirname, struct dire
int (*dcomp)(const struct dirent **, const struct dirent **))
{
struct dirent *d, *p, **names = NULL;
- size_t nitems = 0;
+ size_t arraysz, nitems = 0;
struct stat stb;
- long arraysz;
DIR *dirp;
if ((dirp = opendir(dirname)) == NULL)