Florian Weimer wrote:
Although the critical type size mismatch happens on 32-bit
architectures
and Windows only. Problems like these are the reason why I don't think
the Clang approach of restricting to incompatible-function-pointer-types
only makes much sense.
Uhm, yeah, there are certainly cases where the complaint about mismatched
pointer types is valid. But last I checked, the warning that is now being
turned into an error also complained about "mismatches" where the types are
actually exactly the same on the given architecture, such as int vs. long on
32-bit (or 64-bit Windows), or long vs. long long on 64-bit LP64. And those
"mismatches" can easily happen without being an actual issue, because, e.g.,
the program uses its own definition equivalent to something like size_t or
ptrint_t (especially the latter, since it is non-C90 and hence considered
non-standard by the large pool of software still targeting C90 only, but I
have also seen a lot of custom size_t/ssize_t reinventions) and passes a
pointer to that where a size_t * or ptrint_t * or such is expected.
E.g., I have seen Java bindings doing something like:
jlong foo;
#if SIZEOF_SIZE_T == 8
function_that_expects_an_ssize_t_pointer(&foo);
#else
ssize_t temp = (ssize_t) foo;
function_that_expects_an_ssize_t_pointer(&temp);
foo = (jlong) temp;
#endif
Of course, the compiler has no way to know whether the code is doing
something like this or just incorrectly assuming that
sizeof(ssize_t)==sizeof(jlong) (i.e., 8) everywhere.
Kevin Kofler