Hi!
> >> I think that casting mod_name to (char *) is easier than casting array
> >> before it gets to execvp(). And it doesn't require
> >> any changes of tst_run_cmd interfaces (ie they accepts argv the same way
> >> as execvp does)...
> >>
> >> Maybe leave everything as is and just cast mod_name to (char *)?
> > That is easier for one testcase, but will require the cast in each
> > testcase that will use the interface. From this point of view cast in
> > the library is better. Not elegant solution though. :(
> I google-ed the following:
> http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html 
> section RATIONALE
> 
> So as I understood from this document execvp expects 'char *const 
> argv[]'  to prevent 'non-expert' users from
> casting argv, envp from "char *[]" to "const char *[]".

Not exactly, it looks like this was choosen to be backward compatible
with older code that declared the array as char *argv[] which couldn't
be automatically casted to const char *const argv[]. So they simple
choose variant that has at least one const and allows automatic cast
from char *argv[].

...
Specifying two levels of const- qualification for the argv[] and envp[]
parameters for the exec functions may seem to be the natural choice,
given that these functions do not modify either the array of pointers or
the characters to which the function points, but this would disallow
existing correct code. Instead, only the array of pointers is noted as
constant. The table of assignment compatibility for dst= src derived
from the ISO C standard summarizes the compatibility:

<snip>

Since all existing code has a source type matching the first row, the
column that gives the most valid combinations is the third column. The
only other possibility is the fourth column, but using it would require
a cast on the argv or envp arguments. It is unfortunate that the fourth
column cannot be used, because the declaration a non-expert would
naturally use would be that in the second row.
...

They are actually complaining that as the type exec functions use is
char *const[] it couldn't be automatically casted from const char *[]
as the array would loose the const attribute. Too bad C cannot gain two
const attributes and cast from char *[] to const char *const[] is not
possible that way exec fuction could have take any string array...

Looks like I've learned something new today ;).

> Given this information and:
> > But in the end any of the solutions will work...
> I vote for a "standard" way i.e. casting array elements to (char *) 
> before calling tst_run_cmd or execvp.

Given that we do not have any existing code passing char *[] array to
the tst_run_cmd() I think that we can declare the array as const char
*const[] and cast it in the library.

-- 
Cyril Hrubis
[email protected]

------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to