From: terry@cs.weber.edu (A Wizard of Earth C)
Subject: Re: mktemp - Bus Error.
Organization: Weber State University  (Ogden, UT)
Date: Thu, 5 Nov 92 18:00:07 GMT

In article <9231017.24452@mulga.cs.mu.OZ.AU> ggr@nareen.acci.com.au (Greg Rose) writes:
>In article <1992Nov3.174359.19262@Princeton.EDU> jsm@shade.Princeton.EDU (John Scott McCauley Jr.) writes:
>>In article <KHERA.92Nov3111245@thneed.cs.duke.edu> khera@cs.duke.edu (Vivek Khera) writes:
>>[on mktemp]
>>>you don't need something so complicated.  how about this:
>>>
>>>	char tmpname[] = "/tmp/foo.XXXXXX";
>>>	mktemp(tempname);
>>[should be tmpname]
>>>
>>
>>Careful -- it doesn't work for some C-compilers:
>>"t.c", line 3: no automatic aggregate initialization
>>"t.c", line 3: illegal lhs of assignment operator
>>
>>Program defensively! I'd rather have something complicated that works!
>>
>
>I think there is a misunderstanding here. "line 3" is either legal C,
>and always has been, or illegal C, and still is, depending on where
>the line is.
>
>The word "automatic" in the error message refers to the storage class
>of the variable "tmpname". If line 3 appears inside a function, the
>storage class assumed is "auto", and no, you can't copy around arrays
>like that in C. If line 3 is outside a function, the storage class
>assumed is "extern", and the statement becomes an initialisation of
>the array (not any sort of assignment), and has been legal C since at
>least 1975. No C compiler could refuse it.


Several compilers treat:

	char tmpname[] = "/tmp/foo.XXXXXX";

as if it were:

	char *tmpname = "/tmp/foo.XXXXXX";

...the second is, of course, legal.  This is bad programming style, just as
a construct of the form:

	char *foo = "Hello World" + 6;

	printf( "%s\n", foo);		/* prints "World\n"*/
	printf( "%s\n", foo - 6);	/* depends on code generation*/

is bad style ("style" being synonymous with "practice" here).  If the
compiler generates code the K&R/Portable C compile way, the second
printf() will print "Hello World\n"; otherwise, what it does is not
defined (for instance, Microsoft C).

If the code wasn't going to be reentered (ie: the mktemp() was called only
once), then using a "char *x" or equivalent ("char x[]" on some compilers)
is socially acceptable.

The fact that mktemp() returns a pointer to the modified string (this is
*not* explicitly stated in the Sun man page, but is how it is coded on
Sun and elsewhere, and documented elsewhere) means that you should be
able to use:

	char	*p;

	p = mktemp( "/tmp/foo.XXXXXX");

without ill effect.  The fact that "/tmp/foo.XXXXXX" is considered a
constant by GCC is an error in gcc, according to the rules of prottyping.
This assumes you have an appropriate prototype for mktemp() before calling
it so you can coerce the type of the argument's storage class declarater
in the case of something with a default storage class of "const char"
(ie: a literal string).

For portability, use "*foo" rather than "foo[]" as a pointer declarator
and include all of the necessary header files when using ANSI-C.  Also
prototype your own functions which may be passed "default const" values,
since the compiler isn't smart enough to realize the way the parameters
are used (or rather, the linker isn't smart enough).

If the mktemp() still fails, then there is a problem with type coercion
in the compiler that needs to be fixed.


					Terry Lambert
					terry@icarus.weber.edu
					terry_lambert@novell.com
---
Any opinions in this posting are my own and not those of my present
or previous employers.
-- 
-------------------------------------------------------------------------------
                                        "I have an 8 user poetic license" - me
 Get the 386bsd FAQ from agate.berkeley.edu:/pub/386BSD/386bsd-0.1/unofficial
-------------------------------------------------------------------------------