Return to BSD News archive
Path: sserve!manuel.anu.edu.au!munnari.oz.au!metro!otc!alexk
From: alexk@otc.otca.oz.au (Alex Kowalenko)
Newsgroups: comp.unix.bsd
Subject: Re: mktemp - Bus Error. SUMMARY
Message-ID: <6634@otc.otca.oz>
Date: 29 Oct 92 22:54:21 GMT
Sender: news@otc.otca.oz
Organization: R&D, OTC Sydney, Australia
Lines: 88
--
> I'm having problems with mktemp failing due to a Bus Error.
> Even a simple program like the following will fail:
> #include<stdio.h>
>
> main()
> {
> printf("%s\n",mktemp("XXXX"));
> }
**** jtc@gain.com (J.T. Conklin) said :
>From the GCC Manual:
* GNU CC normally makes string constants read-only. If several
identical-looking string constants are used, GNU CC stores only
one copy of the string.
One consequence is that you cannot call `mktemp' with a string
constant argument. The function `mktemp' always alters the
string its argument points to.
Another consequence is that `sscanf' does not work on some systems
when passed a string constant as its format control string or
input. This is because `sscanf' incorrectly tries to write into
the string constant. Likewise `fscanf' and `scanf'.
The best solution to these problems is to change the program to
use `char'-array variables with initialization strings for these
purposes instead of string constants. But if this is not
possible, you can use the `-fwritable-strings' flag, which
directs GNU CC to handle string constants the same way most C
compilers do. `-traditional' also has this effect, among others.
Since ANSI C allows a compiler to make string constants read-only, and
the changes are usually easy, I tend to fix the code:
main()
{
char buf[16];
strcpy(buf, "/tmp/fooXXXXXX");
printf("%s\n",mktemp(buf));
}
**** michaelm@pike.ee.mcgill.ca (Michael Moscovitch) said something similar
I have come accross this problem. I looked at the source to mktemp() and
found the problem. I don't remember the exact reason, but mktemp() doesn't
work with string constants as parameters. I think it assumes that you
are passing it an array of characters with more space in it. If I remember
correctly, it assumes it can modify the string you pass it. You can get
around it by using an intermediate character array to pass the value.
**** Paul Nulsen <pejn@cc.uow.edu.au> said:
>According to the manual entries for both sys V and bsd systems I have access
>to at the moment (my 386bsd system is at home), the string you give to
>mktemp must have 6 trailing X's. I guess that mktemp is trying to read or
>write beyond the end of your template string - maybe not ideal behaviour,
>but not unreasonable in the circumstances.
Are you reading the Sun man pages or BSD's. From the BSD manual page on mktemp
... The template may be any file name with
some number of `Xs' appended to it, for example /tmp/temp.XXXX. The
trailing `Xs' are replaced with the current process number and/or a
unique letter combination. ...
Source code shows this also.
**** kym@bingsuns.cc.binghamton.edu (R. Kym Horsell)
>SIX X's old bean!!!
RTFMP Spring Chicken!!
Alex Kowalenko ACSnet: alexk@otc.otca.oz
R&D Contractor UUCP: {uunet,mcvax}!otc.otca.oz!alexk
|||| OTC || Fax: +6 2 287 3299
Phone: +6 2 287 3131
Snail: GPO Box 7000, Sydney 2001, Australia