简体   繁体   中英

sprintf vs strcat for appending string

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM