Small query regarding function "char * strerror(int errnum)" | Unix Linux Forums | Programming

  Go Back    


Programming Post questions about C, C++, Java, SQL, and other programming languages here.

Small query regarding function "char * strerror(int errnum)"

Programming


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 01-28-2013
Praveen_218 Praveen_218 is offline
Registered User
 
Join Date: Feb 2008
Last Activity: 26 April 2014, 8:36 AM EDT
Location: Linux Machines @Mumbai & Bangalore
Posts: 165
Thanks: 7
Thanked 28 Times in 26 Posts
Small query regarding function "char * strerror(int errnum)"

As this function returns the address of the string corressponding to the errno value provided to it. Can someone please let me know where, in the memory, it could be (on freeBSD).

The MAN page tells under the BUG section that "For unknown error numbers, the strerror() function will return its result in a static buffer which may be overwritten by subsequent calls."

But it doesn't explictly mentions of anything, under normal conditions, of the storage location of the string that whether its the 'heap' area or some system array which holds the 'string object' whose address is returned by the function strerror().

Additionally what is sys_errlist in freeBSD and how to access it directly? Is it the array/table which holds the strings corressponding to the errno whose address is returned by the function strerror() (the MAN pages didn't tell this explictly); if yes then I have the following further questions:

1) How it is instantialized? Is it unique for every process? When it is instantialized/initialized ?
2) Can it be edited from a program (If not under RO data section) ?

Last edited by Praveen_218; 01-28-2013 at 06:42 AM..
Sponsored Links
    #2  
Old 01-28-2013
JohnGraham JohnGraham is offline
Registered User
 
Join Date: Feb 2010
Last Activity: 9 May 2014, 6:02 PM EDT
Posts: 126
Thanks: 0
Thanked 31 Times in 29 Posts
Where exactly the string is stored is implementation-defined and shouldn't matter to you as an application developer.

sys_errlist is in stdio.h (see 'man sys_errlist'). It is initialized before your main() function is called. I don't know whether it's "editable" or not - frankly I cannot think of any reason that this would be anything other than a terrible, terrible idea.

What exactly are you trying to achieve here - what's the end-goal for this line of enquiry?
Sponsored Links
    #3  
Old 01-29-2013
Praveen_218 Praveen_218 is offline
Registered User
 
Join Date: Feb 2008
Last Activity: 26 April 2014, 8:36 AM EDT
Location: Linux Machines @Mumbai & Bangalore
Posts: 165
Thanks: 7
Thanked 28 Times in 26 Posts
John,
I was confused especially after reading the MAN page itself that mentioned of memory location for “unknown error numbers” (which I referred above) but didn’t talk of the memory location of the address returned by this function under normal circumstances.

The primary reason to ask this query is because of the fact that the MAN pages themselves not making me sure if the programmer needs to handle any kind of cleanup post calling strerror()? Just like the call to stat(), lstat(), fstat() which create objects of type struct stat on the heap itself (whose address is returned through the pointer struct stat *sb) and puts the onus of the cleanup on the programmer only.

Available examples too didn’t give the clarity as they all called the function strerror() and used the address returned into their processing and were of just few lines only. Hence I was not getting sure of the error handling aspect of those few liner examples (sometimes they might just overlook error handling part just to give us the feel of the function).

The code I was working was critical enough not to have scope for silly errors. Hence couldn’t have overlooked the cleanup part if the allocation happens to be on the heap and couldn’t have just called to free the address either if it belonged to a different memory region.

Hope you got the dilemma making me to forward this query to the forum.

Last edited by Praveen_218; 01-29-2013 at 01:28 AM..
    #4  
Old 01-29-2013
Corona688 Corona688 is offline Forum Staff  
Mead Rotor
 
Join Date: Aug 2005
Last Activity: 1 August 2014, 6:49 PM EDT
Location: Saskatchewan
Posts: 19,068
Thanks: 759
Thanked 3,174 Times in 2,977 Posts
Quote:
Originally Posted by Praveen_218 View Post
The primary reason to ask this query is because of the fact that the MAN pages themselves not making me sure if the programmer needs to handle any kind of cleanup post calling strerror()? Just like the call to stat(), lstat(), fstat() which create objects of type struct stat on the heap itself (whose address is returned through the pointer struct stat *sb)
They do no such thing. Pointers do not work that way! You cannot "return an address" through a pointer you pass into a function, any more than you can return a number through a number you pass into a function.

You do not need to clean up after strerror -- or stat, lstat, or fstat, either.
Sponsored Links
    #5  
Old 01-29-2013
Don Cragun's Avatar
Don Cragun Don Cragun is online now Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 2 August 2014, 12:24 AM EDT
Location: San Jose, CA, USA
Posts: 4,225
Thanks: 166
Thanked 1,437 Times in 1,218 Posts
Quote:
Originally Posted by Praveen_218 View Post
John,
I was confused especially after reading the MAN page itself that mentioned of memory location for “unknown error numbers” (which I referred above) but didn’t talk of the memory location of the address returned by this system call under normal circumstances.

The primary reason to ask this query is because of the fact that the MAN pages themselves not making me sure if the programmer needs to handle any kind of cleanup post calling strerror()? Just like the call to stat(), lstat(), fstat() which create objects of type struct stat on the heap itself (whose address is returned through the pointer struct stat *sb) and puts the onus of the cleanup on the programmer only.

Available examples too didn’t give the clarity as they all called the function strerror() and used the address returned into their processing and were of just few lines only. Hence I was not getting sure of the error handling aspect of the few liner examples.

The code I was working was critical enough not to have scope for silly errors. Hence couldn’t have overlooked the cleanup part if the allocation happens to be on the heap and couldn’t have just called to free the address either if it belonged to a different memory region.

Hope you got the dilemma making me forward this query to the forum.
If you call strerror(errno), after getting an error indication from a function that sets errno, strerror() will probably return a pointer to a statically allocated string. If you call strerror(random) with a value that is not a valid error number on your system, strerror() may return a pointer to a string like "Unknown error number xxx" where xxx is random converted to a decimal digit string. The application calling strerror() doesn't need to free the memory to which the return value from strerror() points in either case. But, if you intend to call strerror() multiple times and print the results later, you need to allocate space for a buffer to hold the returned string, copy it to that buffer, and free the buffer when you are done with it.
Sponsored Links
    #6  
Old 01-29-2013
JohnGraham JohnGraham is offline
Registered User
 
Join Date: Feb 2010
Last Activity: 9 May 2014, 6:02 PM EDT
Posts: 126
Thanks: 0
Thanked 31 Times in 29 Posts
Quote:
Originally Posted by Praveed_218
The MAN page tells under the BUG section that "For unknown error numbers, the strerror() function will return its result in a static buffer which may be overwritten by subsequent calls."
Quote:
Originally Posted by Praveen_218
The primary reason to ask this query is because of the fact that the MAN pages themselves not making me sure if the programmer needs to handle any kind of cleanup post calling strerror()?
The man page tells you that the result may be in a static buffer. It tells you this to let you know two things:
  1. You do not need to free the result returned from this function. A static buffer (as in when you use "static" within a function) exists throughout the lifetime of the program and does not need to be released by anyone.
  2. You should not rely on the result being available over multiple calls to strerror(), as in:

    Code:
    char *err1 = strerror(errno);
    some_call();
    char *err2 = strerror(errno);
    printf("Got errors %s and %s\n", err1, err2);

This is because it's possible that the result of both calls to strerror() will be a pointer to the same (static) buffer.
Some advice: When asking questions on forums, ask what you really want to ask, as opposed to second-guessing what you want. When you ask where the result of strerror() will be and if you can edit it, my first instinct is to just say "no, don't do any of that forget about it!", but if you just ask whether you should free() the result and why the man page mentions a static buffer, you'll get a much better response.
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
awk command to replace ";" with "|" and ""|" at diferent places in line of file shis100 Shell Programming and Scripting 7 03-16-2011 08:59 AM
significance of "+" char in SunOS "ls -l" output sayeo Solaris 6 02-28-2009 04:12 AM
ERROR: more than one instance of overloaded function "vprintf" has "C" linkage donatoll HP-UX 0 10-14-2008 05:35 AM
awk "Invalid char ' in expession" error accsam1 Shell Programming and Scripting 3 02-07-2008 05:08 PM
How to convert the "select" function into a "poll" function rbolante Programming 1 07-10-2001 10:49 AM



All times are GMT -4. The time now is 12:28 AM.