Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sprintf() negative return value and errno

Tags:

c

printf

errno

According to http://linux.die.net/man/3/sprintf and http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf() and family return the number of characters written on success. On failure, a negative value is returned. I would assume that an error could occur if the format string is malformed so a negative return value could indicate something other than a malloc() error. Does errno get set to indicate what the error was?

like image 862
Uyghur Lives Matter Avatar asked Feb 08 '13 17:02

Uyghur Lives Matter


People also ask

Can Sprintf returns negative value?

The fprintf() , printf() , and sprintf() functions return the number of characters output, or a negative value if an output error occurs.

Does Sprintf set errno?

If an output error was encountered, these functions shall return a negative value and set errno to indicate the error.

What is Sprintf () in C?

sprintf stands for “String print”. Instead of printing on console, it store output on char buffer which are specified in sprintf.

Why is Sprintf unsafe?

Warning: The sprintf function can be dangerous because it can potentially output more characters than can fit in the allocation size of the string s . Remember that the field width given in a conversion specification is only a minimum value. To avoid this problem, you can use snprintf or asprintf , described below.


2 Answers

C++ defers to C and C does not require or mention errno in the description of sprintf() and family (although for certain format specifiers, these functions are defined to call mbrtowc(), which may set EILSEQ in errno)

POSIX requires that errno is set:

If an output error was encountered, these functions shall return a negative value and set errno to indicate the error.

EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW are mentioned explicitly: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html

like image 176
Cubbi Avatar answered Sep 20 '22 05:09

Cubbi


I always like the "try it out" method when I have a question like this.

char buffer[50];
int n, localerr = 0;
n = sprintf(buffer, "%s", "hello");
localerr = errno; // ensure printf doesn't mess with the result
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));

> 5 chars
errno: 0
strerror: Success

n = sprintf(buffer, NULL, NULL);
localerr = errno;
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr));

> -1 chars
errno: 22
strerror: Invalid argument

Looks like it gets set when compiling with gcc on linux. So that's good data, and in the man page for errno it does mention that printf() (same family as sprintf()) may change errno (in the examples at the bottom).

like image 24
Mike Avatar answered Sep 21 '22 05:09

Mike