Am Mittwoch, dem 06.12.2023 um 13:57 +0100 schrieb Jakub Jelinek: > On Wed, Dec 06, 2023 at 08:31:12PM +0800, Xi Ruoyao wrote: > > On Wed, 2023-12-06 at 13:24 +0100, Jakub Jelinek wrote: > > > I wonder if this part isn't too pedantic or more of a code style. > > > Some packages fail to build with this with -Werror because they do > > > struct S *p = calloc (sizeof (struct S), 1); > > > or similar. It is true that calloc arguments are documented to be > > > nmemb, size, but given sufficient alignment (which is not really different > > > between either order of arguments) isn't it completely valid to allocate > > > char array with sizeof (struct S) elements and then store a struct S > > > object > > > into it? > > > > In PR112364 Martin Uecker has pointed out the alignment may be different > > with the different order of arguments, per C23 (N2293). With earlier > > versions of the standard some people believe the alignment should not be > > different, while the other people disagree (as the text is not very > > clear). > > I can understand implementations which use smaller alignment based on > allocation size, but are there any which consider for that just the second > calloc argument rather than the product of both arguments?
Not that I know of. > I think they'd quickly break a lot of real-world code. There are quite a few projects which use calloc with swapped arguments. > Further I think > "size less than or equal to the size requested" > is quite ambiguous in the calloc case, isn't the size requested in the > calloc case actually nmemb * size rather than just size? This is unclear but it can be understood this way. This was also Joseph's point. I am happy to submit a patch that changes the code so that the swapped arguments to calloc do not cause a warning anymore. On the other hand, the only feedback I got so far was from people who were then happy to get this warning. Martin