Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | Ben Bacarisse <ben.usenet@bsb.me.uk> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: When parameters to printf are in memory |
| Date | 2016-10-04 09:49 +0100 |
| Organization | A noiseless patient Spider |
| Message-ID | <87fuoc33dx.fsf@bsb.me.uk> (permalink) |
| References | (8 earlier) <nsmcbv$2cc$1@dont-email.me> <87r3816u6r.fsf@bsb.me.uk> <nsnqsn$lsj$1@dont-email.me> <87y4285q9a.fsf@bsb.me.uk> <nsvlm7$3r7$1@dont-email.me> |
James Harris <james.harris.1@gmail.com> writes:
> On 01/10/2016 11:15, Ben Bacarisse wrote:
>> James Harris <james.harris.1@gmail.com> writes:
>>
>>> On 30/09/2016 20:53, Ben Bacarisse wrote:
>>>> James Harris <james.harris.1@gmail.com> writes:
>>>> <snip>
>>>>
>>>>> If I omit the size checking for now, how about something like this:
>>>>>
>>>>> for (;;) { /* Each pair of non-format, format */
>>>>>
>>>>> /* Copy normal characters straight to the output buffer */
>>>>> while (*src != '%' && *src != '\0') {
>>>>> *dest++ = *src++;
>>>>> }
>>>>> if (*src == '\0') {
>>>>> break;
>>>>> }
>>>>>
>>>>> /* Copy the format string (starting with %) to a format buffer */
>>>>> format = format_buffer;
>>>>> *format++ = *src++;
>>>>> if (*src == '%') { /* If the source has %% */
>>>>> *dest++ = '%';
>>>>> }
>>>>> else { /* A single percent sign, i.e. starting a format spec */
>>>>> for (;;) { /* Until a terminating character */
>>>>> ch = *src++;
>>>>> if (ch == '\0') ....error....;
>>>>> *format++ = ch;
>>>>> if (ch ....is one of the terminating characters....) break;
>>>>> }
>>>>> *format = '\0';
>>>>>
>>>>> /* Format an argument */
>>>>> bytes = sprintf(dest, format, ....current arg ++....);
>>>>
>>>> The trouble with this is that the type might be wrong. I know you are
>>>> not aiming at totally portable code here, but there could be real
>>>> problems when there is a significant mismatch between the array member
>>>> type and the conversion specifier. Worse, you may need to consider the
>>>> length modifier too.
>>>
>>> That's always the case in C with varargs, isn't it?
>>>
>>> I know some compilers can report type mismatches in the common case of
>>> a printf string literal and some args. But they cannot match in every
>>> case. The va_arg() macro has to have the expected type applied to it.
>>
>> I didn't mean that the user has passed the wrong type -- there's nothing
>> you can do about that -- I meant the type of whatever "current arg ++"
>> denotes could be wrong.
>
> I meant advancing a pointer along the argument array. I should have
> explained it.
Yes, I got that bit -- the ++ was clear enough. That's not the point I
am making but I am running out of ways to make it so I suspect there is
some basic disagreement between us here, maybe about what types are in
C.
>> You suggested that the array might be a union,
>> but there is no guarantee that passing a union object will work. On
>> some systems (probably little-endian ones) it might just work (though
>> not for single-precision float), but it's always going to be
>> non-portable.
>
> It would have been an array where each element was a union. So no
> problem with endianness etc.
The mechanism that is used to pass a union may not work the for all the
types that union might contain. Take an imaginary example where int are
passed by pushing two bytes onto the stack and long by pushing four.
The %d format will use the the "next" two bytes and %ld will use the
next four. Passing a union of an int and long will have to push four
bytes but whether the "next" two correspond to the short in the union
depends on endianness.
But there are very many other possible problems that come does to one
basic problem. If the format has "%d" the corresponding argument must
be an int and not a union that might contain an int.
<snip>
--
Ben.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-29 16:20 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-29 16:43 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-29 20:30 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-29 21:23 +0100
Re: When parameters to printf are in memory BartC <bc@freeuk.com> - 2016-09-29 22:03 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-29 22:35 +0100
Re: When parameters to printf are in memory BartC <bc@freeuk.com> - 2016-09-29 23:11 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-30 19:53 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-30 20:53 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-01 09:08 +0100
Re: When parameters to printf are in memory BartC <bc@freeuk.com> - 2016-10-01 11:15 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-04 08:32 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-10-01 11:15 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-04 08:28 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-10-04 09:49 +0100
Re: When parameters to printf are in memory BartC <bc@freeuk.com> - 2016-10-04 11:43 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-10-04 13:42 +0100
Re: When parameters to printf are in memory BartC <bc@freeuk.com> - 2016-10-04 14:03 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-10-04 14:16 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-04 20:01 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-10-04 20:24 +0100
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-04 20:40 +0100
Re: When parameters to printf are in memory Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-10-04 22:51 +0100
Re: When parameters to printf are in memory "James R. Kuyper" <jameskuyper@verizon.net> - 2016-10-04 14:25 -0400
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-04 20:31 +0100
Re: When parameters to printf are in memory BartC <bc@freeuk.com> - 2016-09-29 17:03 +0100
Re: When parameters to printf are in memory gazelle@shell.xmission.com (Kenny McCormack) - 2016-09-30 12:20 +0000
Re: When parameters to printf are in memory Malcolm McLean <malcolm.mclean5@btinternet.com> - 2016-09-30 05:55 -0700
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-30 20:06 +0100
Re: When parameters to printf are in memory gazelle@shell.xmission.com (Kenny McCormack) - 2016-09-30 22:01 +0000
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-01 09:15 +0100
Re: When parameters to printf are in memory Malcolm McLean <malcolm.mclean5@btinternet.com> - 2016-09-30 23:18 -0700
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-01 09:32 +0100
Re: When parameters to printf are in memory jacobnavia <jacob@jacob.remcomp.fr> - 2016-09-29 18:35 +0200
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-29 19:55 +0100
Re: When parameters to printf are in memory jacobnavia <jacob@jacob.remcomp.fr> - 2016-09-29 21:22 +0200
Re: When parameters to printf are in memory Barry Schwarz <schwarzb@dqel.com> - 2016-09-29 11:20 -0700
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-09-29 20:08 +0100
Re: When parameters to printf are in memory Lőrinczy Zsigmond <nospam@for.me> - 2016-10-02 20:15 +0200
Re: When parameters to printf are in memory Lőrinczy Zsigmond <nospam@for.me> - 2016-10-02 20:19 +0200
Re: When parameters to printf are in memory gazelle@shell.xmission.com (Kenny McCormack) - 2016-10-02 18:29 +0000
Re: When parameters to printf are in memory Lőrinczy Zsigmond <nospam@for.me> - 2016-10-03 07:04 +0200
Re: When parameters to printf are in memory James Harris <james.harris.1@gmail.com> - 2016-10-04 08:36 +0100
Re: When parameters to printf are in memory jacobnavia <jacob@jacob.remcomp.fr> - 2016-10-02 21:27 +0200
csiph-web