I have the following line:
sprintf(someString,"%s%s",someString,someOtherString);
The compiler is giving me the following warning:
//someFile.c:277:15: error: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Werror=restrict]
I want to replace the line with something that won't give me a compile error. I googled the error and learned about restricted pointers and this was my solution:
strcat(someString, someOtherString);
Does this provide the same functionality? It does in my testing, but I don't want to break the code's functionality with some edge case.
You should use strcat
with a sufficiently large destination array.
Using sprintf
with the same array as destination and a string argument for %s
has undefined behavior. Most existing implementations will produce the expected result for the specific case in the question, but the C Standard make it explicitly undefined.
The compiler rightfully complains with a warning that may be hard to decipher:
passing argument 1 to restrict-qualified parameter aliases with argument 3
This means that argument 3 overlaps with the array pointed to by argument 1, which is incorrect if the array pointed to by argument 3 is dereferenced because it would alias memory dereferenced through argument 1 which is declared as a restrict
pointer in sprintf
prototype, implying that no other pointer should read or write memory that is accessed through it.
A corner case such as sprintf(someString, "%.0s%s", someString, someOtherString);
has defined behavior if someOtherString
fits in someString
because argument 3 is not dereferenced but the compiler might still issue the warning.
Using sprintf
to print into the same string as one of the sources is undefined behavior. You could sprintf
to print into a third string but strcat
will be more performant anyway as it doesn't have to parse the format string and do the extra copy. In both cases, it is up to you to ensure that there is sufficient space in someString
to fit contents of someOtherString
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.