Suggested strengthening of -Wconversion
>Submitter-Id: net
>Originator: Matteo Frigo
>Organization:
>Confidential: no
>Synopsis: gcc -Wconversion should warn on implicit 64-bit => 32-bit integral conversions
>Severity: non-critical
>Priority: low
>Category: c
>Class: change-request
>Release: 4.0.3 20051201 (prerelease) (Debian 4.0.2-5) (Debian testing/unstable)
>Environment:
System: Linux glauke 2.6.15 #1 Tue Jan 3 20:46:04 CST 2006 ppc GNU/Linux
Architecture: ppc
host: powerpc-unknown-linux-gnu
build: powerpc-unknown-linux-gnu
target: powerpc-unknown-linux-gnu
configured with: ../src/configure -v --enable-languages=c,c++,java,f95,objc,ada,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.0 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-awt=gtk-default --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-4.0-1.4.2.0/jre --enable-mpfr --disable-softfloat --enable-targets=powerpc-linux,powerpc64-linux --with-cpu=default32 --disable-werror --enable-checking=release powerpc-linux-gnu
>Description:
This report suggests a feature that would aid making 32-bit
applications 64-bit clean.
Specifically, consider the following program fragment:
int foo(char *p, char *q)
{
return p - q;
}
The return type should be ptrdiff_t, but legacy 32-bit code did not
distinguish int from ptrdiff_t. The implicit conversion ptrdiff_t ->
int is a no-op on ILP32, but loses significant bits on LP64, and most
likely does not correspond to the programmer's intent.
Currently, gcc -m64 -O -Wall -W -Wconversion does not issue any
warning in such situations. I maintain that a warning would be
useful, and that gcc should support some flag to enable such a
warning. (I emphasize that, with gcc-4.0.3, -Wconversion is not
sufficient.)
I attach below a patch that issues a warning upon problematic implicit
conversions. (The second warning is probably too obnoxious and should
only be enabled with -pedantic or similar flags.)
I found this patch useful in making fftw 64-bit clean, and I believe
that other programmers would benefit from such a feature. I noted
that Linus uses the ``sparse'' tool to find problematic narrowing
conversions in the linux kernel, and that even VC++ offers such a
warning. gcc ought to offer this feature as well.
Thanks for your time.
Regards,
Matteo Frigo
>How-To-Repeat:
>Fix:
--- /tmp/c-common.c 2005-09-01 11:46:46.000000000 -0500
+++ gcc/c-common.c 2006-01-09 22:36:45.000000000 -0600
@@ -987,6 +987,19 @@
convert_and_check (tree type, tree expr)
{
tree t = convert (type, expr);
+
+ if (warn_conversion) {
+ if (TYPE_PRECISION (type) < TYPE_PRECISION (TREE_TYPE (expr))) {
+ if (TYPE_PRECISION (type) == 32 &&
+ TYPE_PRECISION (TREE_TYPE (expr)) == 64 &&
+ INTEGRAL_TYPE_P (TREE_TYPE (expr))) {
+ warning ("implicit conversion from integral 64-bit to 32-bit type");
+ } else {
+ warning ("implicit conversion to narrower type");
+ }
+ }
+ }
+
if (TREE_CODE (t) == INTEGER_CST)
{
if (TREE_OVERFLOW (t))
Reply to: