473,785 Members | 2,188 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

strtok segfaults in CLI but not in GDB

Hello,
here I have a strange problem with a real simple strtok example.

The program is as follows:

### BEGIN STRTOK ###

#include <string.h>
#include <stdio.h>

int main()
{
char *input1 = "Hello, World!";

char *tok;

tok = strtok(input1, " ");
if(tok) printf("%s\n", tok);

tok = strtok(NULL, " ");
if(tok) printf("%s\n", tok);

return(0);

}

### END STRTOK ###
Now, when I run it from the command line, I get a bus error:

### BEGIN COMMAND LINE OUTPUT ###
gcc -ggdb -Wall -o strtok strtok.c
./strtok
Bus error (core dumped)
Exit 138

### END COMMAND LINE OUTPUT ###

When I run it step by step in GDB, the program terminates normally:

### BEGIN DEBUGGER OUTPUT ###
gdb ./strtok
GNU gdb 6.1.1 [FreeBSD]
[snip]GDB copyright and bla bla[/snip]
(gdb) break main
Breakpoint 1 at 0x8048570: file strtok.c, line 6.
(gdb) run
Starting program: /home/piter/strtok

Breakpoint 1, main () at strtok.c:6
6 char *input1 = "Hello, World!";
(gdb) next
10 tok = strtok(input1, " ");
(gdb)
11 if(tok) printf("%s\n", tok);
(gdb)
Hello,
13 tok = strtok(NULL, " ");
(gdb)
14 if(tok) printf("%s\n", tok);
(gdb)
World!
16 return(0);
(gdb)
18 }
(gdb)
0x08048485 in _start ()
(gdb)
Single stepping until exit from function _start,
which has no line number information.

Program exited normally.
(gdb)

### END DEBUGGER OUTPUT ###

Is there something I'm missing wrt C and/or strtok, or it's rather a
problem related to my environment (in which case I'll be happy to post
in the right newsgroup) ?

Thanx in advance

--
Pietro Cerutti

PGP Public Key ID:
http://gahr.ch/pgp
May 16 '07 #1
29 2587
Pietro Cerutti wrote:
Hello,
here I have a strange problem with a real simple strtok example.

The program is as follows:

### BEGIN STRTOK ###

#include <string.h>
#include <stdio.h>

int main()
{
char *input1 = "Hello, World!";

char *tok;

tok = strtok(input1, " ");
strtok alters its input. You are passing it a string literal, modifying
a string literal invokes the demons of undefined behavior. Don't.

--
Ian Collins.
May 16 '07 #2
Pietro Cerutti said:
Hello,
here I have a strange problem with a real simple strtok example.

The program is as follows:

### BEGIN STRTOK ###

#include <string.h>
#include <stdio.h>

int main()
{
char *input1 = "Hello, World!";

char *tok;

tok = strtok(input1, " ");
strtok modifies the string you pass it. You pass it a string literal.
You're not allowed to modify string literals.

Change

char *input1 = "Hello, World!";

to

char input1[] = "Hello, World!";
--
Richard Heathfield
"Usenet is a strange place" - dmr 29/7/1999
http://www.cpax.org.uk
email: rjh at the above domain, - www.
May 16 '07 #3
Pietro Cerutti wrote:
char *input1 = "Hello, World!";
just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as

char input1[14] = "Hello, World!";

The thing I don't understand is: why does it works in GDB?

--
Pietro Cerutti

PGP Public Key:
http://gahr.ch/pgp
May 16 '07 #4
Pietro Cerutti wrote:
Pietro Cerutti wrote:
> char *input1 = "Hello, World!";

just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as

char input1[14] = "Hello, World!";

The thing I don't understand is: why does it works in GDB?
Luck?

--
Ian Collins.
May 16 '07 #5
Ian Collins wrote:
Pietro Cerutti wrote:
>Pietro Cerutti wrote:
>> char *input1 = "Hello, World!";
just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as

char input1[14] = "Hello, World!";

The thing I don't understand is: why does it works in GDB?
Luck?
Ya, maybe.

The point is:
I understand what UB means, so WW3 could start now and I'd know why...

But if a string literal is - by definition - not modifiable, then how
can it happen that GDB actually modifies it using strtok?

--
Pietro Cerutti

PGP Public Key:
http://gahr.ch/pgp
May 16 '07 #6
Pietro Cerutti wrote:
here I have a strange problem with a real simple strtok example.
Guess: you're trying to use it on a literal string.
The program is as follows:

### BEGIN STRTOK ###

#include <string.h>
#include <stdio.h>

int main()
{
char *input1 = "Hello, World!";

char *tok;

tok = strtok(input1, " ");
if(tok) printf("%s\n", tok);

tok = strtok(NULL, " ");
if(tok) printf("%s\n", tok);

return(0);

}
(fx:dancing) Yes!

`strtok` writes to its argument -- it sticks nuls in there to make
the strings it returns.

You're not allowed to write into a string literal: that gets you
undefined behaviour.

An implementation may just write into the string. Or it may abort in
some way. Or it may ignore the write. Or it may write somewhere else
entirely. Or it may mail a report to your co-coders, or start a game
of rogue, or book you a holiday in the Lake District, or set fire to
your keyboard, or arrange a date with your Most Preferred Person.

[That last one never seems to happen, though.]

--
"You've spotted a flaw in my thinking, Trev" Big Al,/The Beiderbeck Connection/

Hewlett-Packard Limited registered office: Cain Road, Bracknell,
registered no: 690597 England Berks RG12 1HN

May 16 '07 #7
Chris Dollin wrote:
You're not allowed to write into a string literal: that gets you
undefined behaviour.

An implementation may just write into the string.
Uh? So you mean that a string literal isn't unmodifiable by definition?
--
Pietro Cerutti

PGP Public Key:
http://gahr.ch/pgp
May 16 '07 #8
Pietro Cerutti <ga**@gahr.chwr ites:
Pietro Cerutti wrote:
> char *input1 = "Hello, World!";

just in case, I know that the string to be tokenized shouldn't be a
constant, but rather an array of chars.
So, it should be declared as

char input1[14] = "Hello, World!";

The thing I don't understand is: why does it works in GDB?
Because it invokes undefined behavior. There are no rules about what
happens. It can crash, it can "work", it can make demons fly out of
your nose.

(I suppose string literals are stored in write-protected memory when
your program runs normally, but not when it runs under gdb -- which
seems odd.)

--
Keith Thompson (The_Other_Keit h) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
May 16 '07 #9
Keith Thompson wrote:
(I suppose string literals are stored in write-protected memory when
your program runs normally, but not when it runs under gdb -- which
seems odd.)
Yes it's weird, but it's a logical explanation.
I'll investigate with the freebsd people..
Thank you.

--
Pietro Cerutti

PGP Public Key:
http://gahr.ch/pgp
May 16 '07 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
1465
by: Naveen Parihar | last post by:
I've a binary that runs on most of our servers but segfaults on one of the servers. Further, even on this specific machine, the binary runs successfully sometimes but segfaults most of the time. While trying to debug this behaviour using gdb, I found out that the segfaults occurs randomly at different places in the code. For example, once a pointer was not initiallized to NULL (it was pointing to x8 insterad of x0) in a constructor, even...
40
3525
by: Fatih Gey | last post by:
Hi, .. following causes a segfault. .. didn't know why ?! int main() { char name; strcpy (name, "ab8bc8cd8ed"); char cur;
13
4927
by: ern | last post by:
I'm using strtok( ) to capture lines of input. After I call "splitCommand", I call strtok( ) again to get the next line. Strtok( ) returns NULL (but there is more in the file...). That didn't happen before 'splitCommands' entered the picture. The problem is in splitCommands( ) somehow modifying the pointer, but I HAVE to call that function. Is there a way to make a copy of it or something ? /* HERE IS MY CODE */ char *...
17
5212
by: bofh1234 | last post by:
I need to delimit a string. The delimiters are a semicolon and comma. When I run the program I get a segmentation fault on the first strtok. I followed the examples of others and from my old C books, but I can't seem to find the problem. The accesslist has a format of 20,45;22,44;46,28;99,43,etc. What am I doing wrong? Thanks, #include <sys/signal.h> #include <messages.h>
8
1931
by: hu | last post by:
hi, everybody! I'm testing the fuction of strtok(). The environment is WinXP, VC++6.0. Program is simple, but mistake is confusing. First, the below code can get right outcome:"ello world, hello dreams." #include <stdafx.h> #include <string.h> #include <stdio.h> int main()
4
2735
by: Michael | last post by:
Hi, I have a proble I don't understand when using strtok(). It seems that if I make a call to strtok(), then make a call to another function that also makes use of strtok(), the original call is somehow confused or upset. I have the following code, which I am using to tokenise some input which is in th form x:y:1.2: int tokenize_input(Sale *sale, char *string){
3
3811
by: nomad5000 | last post by:
Hi everybody! I'm having trouble using strtok to fill a matrix with int nrs. from a file. the code that is not working is the following: #include <iostream> #include <fstream> #include <string> #include <stdlib.h> using namespace std;
11
17178
by: magicman | last post by:
can anyone point me out to its implementation in C before I roll my own. thx
12
2360
by: Pilcrow | last post by:
Here is a quick program, together with its output, that illustrates what I consider to be a deficiency of the standard function strtok from <string.h>: I am using C:\>gcc --version gcc (GCC) 3.4.5 (mingw special) I would like there to be a default, to be returned when two delimiters
0
9646
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9484
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
1
7505
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
6742
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5386
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5518
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4055
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
3658
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2887
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.