Posted primarily as a google lookup.
Once again I need to brush up on my C. In order to get borderless terminals with aterm and fluxbox working, I had to use bblaunch. As it turns out, bblaunch, an unmaintained program that both blackbox and fluxbox use, has the following line of code in it:
sprintf(launchargs.call, "%s", (char *)atoi(argv[0]));
With launchargs being a struct:
typedef struct LArgs
{
char call[1024];
char command[1024];
unsigned long flags, attrib, workspace, stack, decoration;
unsigned long pause;
Bool iconic;
} LArgs;
While that line works fine in Redhat 8, it segfaults under Fedora Core 2. As it turns out, launchargs.call is not actually used, so I was able to comment out that line in bblaunch and recompile and everything worked fine. Now I need to dig in to find out the reason for the segfault. If only I knew C as well as Perl.
Now I need to dig in to find out the reason for the segfault. If only I knew C as well as Perl.
If you've not got a coredump already from it, I'd suggest running it under gdb and using that to
see where it goes boom. All the code looks legal, and I can't see anything that can actually go wrong. Except that argv[0] might be a null pointer. Which seems unlikely, but is the only possible problem that I can spot.
Unless something weird is going on, argv[0] should be the program name. So doing an atoi will generally produce nothing useful, unless the program's name is 666 or some such.
That said, it seems a far simpler way to do what the code's doing is to just use sprintf to do the work:
Which would do nothing -- including not segfault -- ifsprintf(launchargs.call, "%d", argv[0]);
argv[0] isn't numeric.
Fair warning: it's 4:30 am as I write this, after a bout of insomnia. Use at your own risk.
Re:Strange construct
rooneg on 2004-08-07T14:59:34
Worse yet, calling atoi on it will give you back an integer, which is then being cast to a char *, so you're looking in whatever bit of memory the integer value you get refers to and treating it as a character array. There's nothing good that can come of this, it's quite broken.Re:Strange construct
nicholas on 2004-08-07T21:48:58
Oh yes, crap. I missed that cast.
Re:Strange construct
nicholas on 2004-08-07T21:51:28
Unless something weird is going on, argv[0] should be the program name.True. There's insufficient context to see whether anyone modified
argv(++argvor somesuch). I'm not sure if I'd count modifyingargvas weird though, as I've been known to write code that increments it in awhileloop to process all command line arguments.Re:Strange construct
VSarkiss on 2004-08-07T22:11:41
I meant unless
argvisn't even the command line: if it's an array internal to the program or something. Nothing in C enforces usingargcandargvfor program arguments; it's just a convention that is all too often broken.