public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: chrubis@suse.cz
To: Stanislav Kholmanskikh <stanislav.kholmanskikh@oracle.com>
Cc: vasily.isaenko@oracle.com, ltp-list@lists.sourceforge.net,
	alexey.kodanev@oracle.com
Subject: Re: [LTP] [PATCH] tst_run_cmd: const correctness
Date: Wed, 7 Aug 2013 16:24:45 +0200	[thread overview]
Message-ID: <20130807142445.GA7331@rei> (raw)
In-Reply-To: <520252CC.9050900@oracle.com>

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
chrubis@suse.cz

------------------------------------------------------------------------------
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
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  parent reply	other threads:[~2013-08-07 14:24 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <51FFBCC1.3030101@oracle.com>
2013-08-06  9:11 ` [LTP] [PATCH V3] tst_run_cmd: added support for stdout and stderr redirection Stanislav Kholmanskikh
2013-08-06  9:11 ` [LTP] [PATCH 1/2 " Stanislav Kholmanskikh
2013-08-06 11:13   ` chrubis
2013-08-06 12:54     ` [LTP] [PATCH 1/2 V4] " Stanislav Kholmanskikh
2013-08-06 13:04       ` chrubis
2013-08-06 12:54     ` [LTP] [PATCH 2/2 V4] lib/tst_module.c: modification for updated tst_run_cmd specification Stanislav Kholmanskikh
2013-08-06  9:11 ` [LTP] [PATCH 2/2 V3] " Stanislav Kholmanskikh
2013-08-06 11:15   ` chrubis
     [not found]     ` <52021245.1050003@oracle.com>
2013-08-07 10:24       ` chrubis
2013-08-07 11:22         ` [LTP] [PATCH] tst_run_cmd: const correctness Stanislav Kholmanskikh
2013-08-07 12:10           ` chrubis
     [not found]             ` <52023F30.9000401@oracle.com>
2013-08-07 12:55               ` chrubis
     [not found]                 ` <520252CC.9050900@oracle.com>
2013-08-07 14:24                   ` chrubis [this message]
2013-08-08  7:18                     ` [LTP] [PATCH V2] " Stanislav Kholmanskikh
2013-08-12 11:51                       ` chrubis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130807142445.GA7331@rei \
    --to=chrubis@suse.cz \
    --cc=alexey.kodanev@oracle.com \
    --cc=ltp-list@lists.sourceforge.net \
    --cc=stanislav.kholmanskikh@oracle.com \
    --cc=vasily.isaenko@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox