[PATCH 1/6] [MTD-UTILS] nandwrite: Qualifier Clean-up

Enrico Scholz enrico.scholz at sigma-chemnitz.de
Tue Sep 9 13:14:42 EDT 2008

Grant Erickson <gerickson at nuovations.com> writes:

>>> +static const char *mtd_device, *img;
>> would it be possible to split this into two declarations?  I
>> really don't know if 'img' points to a constant or non-constant
>> char...
> As currently implemented, both mtd_device and img point to
> effectively read-only information. That is, there is no need to
> modify or to attempt to modify what they point to.

Sorry, I might be unclear here. My comment was about readability
not about correctness; e.g. without studying C standard, it is
not obvious to me, whether

| char const *a, *b;


| char const *a;
| char const *b;


| char const *a;
| char *b;

When you think that answer to this question is trivial, then
please explain 'char * const *a, *b;' ;)

>>> -int main(int argc, char **argv)
>>> +int main(int argc, char * const argv[])
>> Is this really correct?  C standard mentions only
>>                int main(void) { /* ... */ }
>>                int main(int argc, char *argv[]) { /* ... */ }
>> as program entry points.  I suggest to cast 'argv' to a corresponding
>> data type when it is used.
> Those are certainly the two most common prototypes for main. However,
> because main has no prototype

Compiler knows about the two possible prototypes. Perhaps next gcc
version or another compiler (icc) complains about the non-standard

> adding the const qualifier simply conveys current program
> intent. That is, the strings pointed to by argv are not
> modified.

Then, you can write

| int main(int argc, char const * const argv[])


fwiw, the const'ness if argv[] content is violated when calling
GNU getopt(3) as it reorders arguments.  E.g.

| argv[] = { "foo", "-a", "bar", "-c", NULL }

is changed by this function to

| argv[] = { "foo", "-a", "-c", "bar", NULL }


More information about the linux-mtd mailing list