fgets problems


 
Thread Tools Search this Thread
Top Forums Programming fgets problems
# 8  
Old 02-19-2010
I don't see a main() anywhere, so that really can't be the only code. alloc/free bugs in code completely outside yours can cause crashes later.
# 9  
Old 02-19-2010
No, not nearly all of it -- I have 3200 LOC on top of a 6700 kB library. But those functions, together with 'glue code' for the library, can be compiled into the core application of the Pari library, called GP. So these functions provide stand-alone functionality.

Well, actually that's not true. They are called via this function:
Code:
GEN
bfile(GEN name, GEN v, GEN offset)
{
	pari_sp ltop = avma;
	GEN cur = gen_0, Anum = gen_0;
	// If no v is given, fine; but if it is it must be a vector.
	// Should this use is_vec_t(typ(v)) to allow t_COL as well?
	if (v && typ(v) != t_VEC)
		pari_err(typeer, "bfile");
	if (!offset)
		offset = gen_1;
	else if (typ(offset) != t_INT)
		pari_err(typeer, "bfile");
	cur = subis(offset, 1);
	
	if (typ(name) == t_INT)
	{
		name = gtovec(GENtoGENstr(name));
		GEN p2;
		while (glength(name) < 6)
		{
			p2 = cgetg(2, t_VEC);
			gel(p2, 1) = strtoGENstr("0");
			name = concat(p2, name);
		}
		Anum = concat(name, NULL);	// "0","0","0","0","4","0" -> "000040"
		name = concat(concat(strtoGENstr("b"), Anum), strtoGENstr(".txt"));
	} else {
		if (typ(name) != t_STR)
			pari_err(typeer, "bfile");
		// TODO: Try to extract a reasonable A-number, or just set to blank?
		Anum = strtoGENstr("000000");
		//Anum = concat(extract0(gtovec(name), stoi(126), NULL), NULL);
	}
	
	char* filename = GSTR(name);
	if (!v)
		return bfilein(filename);
	FILE *f = fopen(filename, "r");
	if (f)
		pari_warn(warner, "File `%Ps' already exists. Appending terms..", name);
	
	long l1 = lg(v);
	pari_sp btop = avma, st_lim = stack_lim(btop, 1);
	long i;
	for (i = 1; i < l1; ++i)
	{
		GEN e = gel(v, i);
		if (typ(e) != t_INT)
			pari_err(typeer, "bfile");
		if (cmpis(digits(e), 1000) > 0)
		{
			pari_warn(warner, "Next term has %Ps digits; exiting.\n", digits(e));
			break;
		}
		write0(filename, mkvec3(cur = addis(cur, 1), strtoGENstr(" "), e));
		if (low_stack(st_lim, stack_lim(btop, 1)))
			cur = gerepilecopy(btop, cur);
	}
	pari_printf("%%H A%Ps Author, <a href=\"b%Ps.txt\">Table of n, a(n) for n = %Ps..%Ps</a>\n", Anum, Anum, offset, cur);
	avma = ltop;
	return gnil;
}

which is itself called by GP. But I thought those functions could be understood in isolation.

Overview:
  • GP is a programmable calculator; C functions can be exposed directly to the users.
  • Anything marked "GEN" is a bignum object that interacts with the Pari library.
  • GEN bfile(GEN, GEN, GEN) can be called by the user with input. It turns the first argument into a filename ("file.txt" -> "file.txt"; 123456 -> "b123456.txt"; 40 -> "b000040.txt"). If the latter two arguments are NULL (in this case, this means the user sent only one argument to the function through GP), then GEN bfile (char*) is called. (The file is first checked to make sure it exists.) Otherwise, this function creates a file at that location and outputs data to it.
  • GEN bfile(char*) takes a filename, opens the file, and reads in the data, storing it to a GEN object it will pass back to GP
# 10  
Old 02-19-2010
You have a lot of heap memory involvement. ie., hidden library calls to malloc - you need a malloc debugger.

electric fence is a great tool for finding these kinds of problems, IMO. You're on Linux, so it is likely already be part of your distribution.
efence(3): Electric Fence Malloc Debugger - Linux man page

Read the page above, re-compile your app, and run it.

If your executable eats your system memory, you could also consider Purify and/or Checkergcc which when used to compile code will run most of the checks Purify performs. Both of these consume way less memory than efence.
# 11  
Old 02-20-2010
Quote:
Originally Posted by jim mcnamara
You have a lot of heap memory involvement. ie., hidden library calls to malloc - you need a malloc debugger.
Huge amounts of memory management -- much more in the calculation parts of my program. Pari essentially forces you to manage all your own memory.

But malloc itself isn't really ever called, not even in the library calls (except initialization). All the memory is allocated initially, and the program tracks usage itself. So when I write

Code:
GEN x = stoi(3); // x = 3
GEN y = stoi(4); // y = 4
GEN z = addii(x, y); // z = x + y
z = mulii(z, x); // z *= x

malloc is called zero times in that sequence, but four objects are created in a large block of memory. The block of memory (called the Pari stack -- but it's just a large malloc'd variable, really) functions as a stack, insofar as it's my responsibility to leave return values at the top and move the pointers as needed to let garbage drop off.


Do you think these programs would be able to handle such a low-level system?
# 12  
Old 02-20-2010
Memory is memory. It doesn't have to track the contents of the pari block to notice clobbering happening outside it.

And you might be surprised what calls malloc. Even printf does.
# 13  
Old 02-20-2010
Quote:
Originally Posted by Corona688
Memory is memory. It doesn't have to track the contents of the pari block to notice clobbering happening outside it.
Sure -- but that's not the problem (and it won't be the problem). Every time the library uses the stack it ensures that there's room for what it's creating. Also, the stack is very large -- at least 20 MB and sometimes as big as 1 GB, with its pointer avma moving by [only] several bytes per call.

The real problem with memory management is leaving garbage on the stack (another possibility is returning corrupted objects). The usual technique for is

Code:
GEN genericfunction(----) {
	pari_sp ltop = avma;	// Keep a pointer to the top of the stack's current location
	GEN r;	// Return value (assigned below)

	// ...
	
	r = gerepileupto(ltop, r);	// copy r to the top of the stack and move avma just above it
	return r;
}

which ensures that you're not leaving garbage on the stack. But this is somewhat more complicated by returning complicated objects like vectors. For example:
Code:
GEN vector = cgetg(4, t_VEC); // Make a vector
gel(vector, 1) = gen_2;
int i = 2;
for(; i < 4; i++)
  gel(vector, i) = addii(gel(vector, i-1), mulii(gel(vector, i-1), gel(vector, i-1))); // v[i] = v[i-1] + v[i-1]^2

Memory diagram:

(vector with pointers to its members A, B, and C)(A)(garbage)(B)(garbage)(C)
# 14  
Old 02-20-2010
Quote:
Sure -- but that's not the problem (and it won't be the problem).
Of all the faith-based initiatives Bush funded, faith-based software maintenance has to be the worst. Smilie Bottom line is, you don't know why it crashed, don't know why it stopped crashing, and don't know if the problem is truly solved yet or not. All we know is that something trashed some memory somewhere somehow. Time for a memory debugger.

All this odd stack rearranging makes me more and more suspicious of memory trashing, not less! When it works perfectly it works perfectly, but one mistake and you're mangling your own stack frame. It could also be a disguised array-bounds problem, these macros are using hidden stack variables and writing beyond them could smash your stack too.

Last edited by Corona688; 02-20-2010 at 05:22 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

while and do problems

Any ideas how to clear this error as it seems I dont understand if,do,while and els commands #!/bin/ksh set -x print "This script creates test messages" print "Please enter test case name" read testcasename echo $testcasename skipfield=Y while print "Do you want to skip this field... (4 Replies)
Discussion started by: andrew.p.mcderm
4 Replies

2. Programming

fgets read file line with "\n" inside

Hi, I have a string like this, char str ="This, a sample string.\\nThis is the second line, \\n \\n, we will have one blank line"; if I want to use strtok() to seperate the string, which token should I use? I tried "\n", "\\n", either not working. peter (1 Reply)
Discussion started by: laopi
1 Replies

3. Programming

fgets problems newline

hello, i'm trying to write a C-program that reads a file line by line. (and searches each line for a given string) This file is an special ASCII-database-file, with a lot of entries. I checked the line with most length, and it was about 4000 characters. With google i found several... (4 Replies)
Discussion started by: p1cm1n
4 Replies

4. UNIX for Dummies Questions & Answers

Problems with using less

Hello, I am having problems with using less on Linux version 2.6.18-92.1.17.el5 (brewbuilder@hs20-bc1-7.build.redhat.com) (gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)). I am using csh but have the same problems on bash. If I pipe something to less it works perfectly i.e. cat file | less... (9 Replies)
Discussion started by: z1dane
9 Replies

5. Programming

[C] fgets problem with SIGINT singlal!!!

Hi all, I have this method to read a string from a STDIN: void readLine(char* inputBuffer){ fgets (inputBuffer, MAX_LINE, stdin); fflush(stdin); /* remove '\n' char from string */ if(strlen(inputBuffer) != 0) inputBuffer = '\0'; } All work fine but if i... (1 Reply)
Discussion started by: hurricane86
1 Replies

6. Programming

Question about NULL Character & fgets()

Assume client send the message " Hello ", i get output such as Sent mesg: hello Bytes Sent to Client: 6 bytes_received = recv(clientSockD, data, MAX_DATA, 0); if(bytes_received) { send(clientSockD, data, bytes_received, 0); data = '\0';... (2 Replies)
Discussion started by: f.ben.isaac
2 Replies

7. Programming

Problem with fgets and rewind function ..

Hello Friends, I got stuck with fgets () & rewind() function .. Please need help.. Actually I am doing a like, The function should read lines from a txt file until the function is called.. If the data from the txt file ends then it goes to the top and then again when the function is called... (1 Reply)
Discussion started by: user_prady
1 Replies

8. Programming

fgets()

does anyone knows how to accept a command from a user.. i was wondering to use fgets(), but got no idea how to start it... (4 Replies)
Discussion started by: skanky
4 Replies

9. UNIX for Dummies Questions & Answers

Problems with ld.so.1

I renamed ld.so.1 on a Sun machine running Solaris 2.6. Now I cannot boot the system and I can use only very few commands in Maintenance Mode. Can someone help me? (3 Replies)
Discussion started by: ciccio
3 Replies

10. UNIX for Advanced & Expert Users

'make' problems (compliation problems?)

I'm trying to compile and install both most recent version of 'make' and the most recent version of 'openssh' on my Sparc20. I've run into the following problems... and I don't know what they mean. Can someone please help me resolve these issues? I'm using the 'make' version that was... (5 Replies)
Discussion started by: xyyz
5 Replies
Login or Register to Ask a Question