This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

aliasing warnings [patch]



The appended patch causes warnings to be generated, in
-fstrict-aliasing mode, when a pointer is cast to a type outside its
alias set.  char * and void * are excepted, as are casts from T to
union containing T; the latter is warned about anyway with -pedantic.

The warnings would be much more useful if they named the types, but I
don't see a way of extracting a type name from the tree that defines
it.  c-aux-info.c has a lengthy private function to do it.

The gcc source code triggers this warning about 200 times during a
normal bootstrap.  I looked at a random sample of the lines warned
about, and all of them appear to be at least questionable.

I'm not sure how many false negatives this will generate.  Casting
through char * or void * suppresses the warning, so a genuine aliasing
bug can be masked - in particular, a memcpy() that takes char * args
and casts them to long * may have problems but get no warning.

zw

===================================================================
Index: c-typeck.c
--- c-typeck.c	1999/09/16 04:16:31	1.37
+++ c-typeck.c	1999/09/16 16:33:38
@@ -3645,23 +3645,59 @@ build_c_cast (type, expr)
 
       /* Optionally warn about potentially worrisome casts.  */
 
-      if (warn_cast_qual
-	  && TREE_CODE (type) == POINTER_TYPE
+      if (TREE_CODE (type) == POINTER_TYPE
 	  && TREE_CODE (otype) == POINTER_TYPE)
 	{
-	  /* Go to the innermost object being pointed to.  */
-	  tree in_type = type;
-	  tree in_otype = otype;
+	  tree in_type, in_otype;
 
-	  while (TREE_CODE (in_type) == POINTER_TYPE)
-	    in_type = TREE_TYPE (in_type);
-	  while (TREE_CODE (in_otype) == POINTER_TYPE)
-	    in_otype = TREE_TYPE (in_otype);
+	  /* Take off one layer of POINTER_TYPE nodes, then check for
+	     a cast between pointers in different alias sets.  */
+	  in_type = TREE_TYPE (type);
+	  in_otype = TREE_TYPE (otype);
+
+	  /* Warn if source and destination types are in distinct
+	     alias sets, and neither source nor destination is char or
+	     void.  */
+	  if (get_alias_set (in_type) != get_alias_set (in_otype)
+	      && TYPE_MAIN_VARIANT (in_type)  != void_type_node
+	      && TYPE_MAIN_VARIANT (in_otype) != void_type_node
+	      && TYPE_MAIN_VARIANT (in_type)  != char_type_node
+	      && TYPE_MAIN_VARIANT (in_otype) != char_type_node)
+	    {
+	      if (pedantic)
+		pedwarn ("pointer cast may violate ISO C aliasing rules");
+	      else if (TREE_CODE (in_type) != UNION_TYPE)
+		warning ("pointer cast may violate ISO C aliasing rules");
+	      else
+		{
+		  /* GNU extension: a cast from pointer to TYPE to
+		     pointer to union containing TYPE is allowed.  */
+		  tree field;
+		  for (field = TYPE_FIELDS (in_type);
+		       field;
+		       field = TREE_CHAIN (field))
+		    if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (field)),
+				   TYPE_MAIN_VARIANT (in_otype)))
+		      break;
+		  if (! field)
+		    warning ("pointer cast may violate ISO C aliasing rules");
+		}
+	    }
+
+	  if (warn_cast_qual)
+	    {
+	      /* Now go all the way to the base type and check that the
+		 qualifiers match.  */
+	      while (TREE_CODE (in_type) == POINTER_TYPE)
+		in_type = TREE_TYPE (in_type);
+	      while (TREE_CODE (in_otype) == POINTER_TYPE)
+		in_otype = TREE_TYPE (in_otype);
 	  
-	  if (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type))
-	    /* There are qualifiers present in IN_OTYPE that are not
-	       present in IN_TYPE.  */
-	    pedwarn ("cast discards qualifiers from pointer target type");
+	      if (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type))
+		/* There are qualifiers present in IN_OTYPE that are not
+		   present in IN_TYPE.  */
+		pedwarn ("cast discards qualifiers from pointer target type");
+	    }
 	}
 
       /* Warn about possible alignment problems.  */

Here is the list of warnings:

libf2c/libI77/rdfmt.c:213: warning: pointer cast may violate ISO C aliasing rules
libf2c/libI77/rsne.c:124: warning: pointer cast may violate ISO C aliasing rules
gcc/cp/call.c:400: warning: pointer cast may violate ISO C aliasing rules
gcc/cp/call.c:401: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1121: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1182: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1240: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1293: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1350: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1388: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1426: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1464: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1577: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1615: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1653: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1691: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1747: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1803: warning: pointer cast may violate ISO C aliasing rules
gcc/f/bld.c:1969: warning: pointer cast may violate ISO C aliasing rules
gcc/f/equiv.c:938: warning: pointer cast may violate ISO C aliasing rules
gcc/f/equiv.c:951: warning: pointer cast may violate ISO C aliasing rules
gcc/f/equiv.c:952: warning: pointer cast may violate ISO C aliasing rules
gcc/f/equiv.c:1334: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:44: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:45: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:46: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:47: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:204: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:212: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:247: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:251: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:252: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:253: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:254: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:308: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:311: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:411: warning: pointer cast may violate ISO C aliasing rules
gcc/f/malloc.c:462: warning: pointer cast may violate ISO C aliasing rules
gcc/f/name.c:74: warning: pointer cast may violate ISO C aliasing rules
gcc/f/name.c:177: warning: pointer cast may violate ISO C aliasing rules
gcc/f/name.c:198: warning: pointer cast may violate ISO C aliasing rules
gcc/f/name.c:217: warning: pointer cast may violate ISO C aliasing rules
gcc/f/name.c:237: warning: pointer cast may violate ISO C aliasing rules
gcc/f/name.c:238: warning: pointer cast may violate ISO C aliasing rules
gcc/f/sta.c:162: warning: pointer cast may violate ISO C aliasing rules
gcc/f/sta.c:167: warning: pointer cast may violate ISO C aliasing rules
gcc/f/sta.c:216: warning: pointer cast may violate ISO C aliasing rules
gcc/f/sta.c:218: warning: pointer cast may violate ISO C aliasing rules
gcc/f/sta.c:1602: warning: pointer cast may violate ISO C aliasing rules
gcc/f/sta.c:1604: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:4895: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9073: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9074: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9075: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9076: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9246: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9263: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9289: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9295: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9297: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9317: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:9963: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stc.c:10045: warning: pointer cast may violate ISO C aliasing rules
gcc/f/std.c:643: warning: pointer cast may violate ISO C aliasing rules
gcc/f/std.c:727: warning: pointer cast may violate ISO C aliasing rules
gcc/f/std.c:1557: warning: pointer cast may violate ISO C aliasing rules
gcc/f/std.c:1558: warning: pointer cast may violate ISO C aliasing rules
gcc/f/ste.c:2903: warning: pointer cast may violate ISO C aliasing rules
gcc/f/ste.c:2995: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:87: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:142: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:148: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:151: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:168: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:421: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:428: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:444: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:536: warning: pointer cast may violate ISO C aliasing rules
gcc/f/storag.c:567: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stt.c:918: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stt.c:940: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stt.c:961: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stt.c:1018: warning: pointer cast may violate ISO C aliasing rules
gcc/f/stt.c:1040: warning: pointer cast may violate ISO C aliasing rules
gcc/f/where.c:100: warning: pointer cast may violate ISO C aliasing rules
gcc/f/where.c:152: warning: pointer cast may violate ISO C aliasing rules
gcc/f/where.c:184: warning: pointer cast may violate ISO C aliasing rules
gcc/f/where.c:188: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-dump.c:455: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-write.c:564: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-write.c:566: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-write.c:576: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-write.c:577: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-write.c:609: warning: pointer cast may violate ISO C aliasing rules
gcc/java/jcf-write.c:2878: warning: pointer cast may violate ISO C aliasing rules
libchill/continue.c:73: warning: pointer cast may violate ISO C aliasing rules
libchill/delaycase.c:193: warning: pointer cast may violate ISO C aliasing rules
libchill/sendbuffer.c:111: warning: pointer cast may violate ISO C aliasing rules
libchill/sendbuffer.c:143: warning: pointer cast may violate ISO C aliasing rules
libchill/waitbuffer.c:212: warning: pointer cast may violate ISO C aliasing rules
libchill/waitbuffer.c:253: warning: pointer cast may violate ISO C aliasing rules
libobjc/class.c:174: warning: pointer cast may violate ISO C aliasing rules
libobjc/class.c:175: warning: pointer cast may violate ISO C aliasing rules
libobjc/class.c:179: warning: pointer cast may violate ISO C aliasing rules
libobjc/class.c:180: warning: pointer cast may violate ISO C aliasing rules
gcc/builtins.c:1731: warning: pointer cast may violate ISO C aliasing rules
gcc/calls.c:231: warning: pointer cast may violate ISO C aliasing rules
gcc/dwarf2out.c:7359: warning: pointer cast may violate ISO C aliasing rules
gcc/dwarf2out.c:7363: warning: pointer cast may violate ISO C aliasing rules
gcc/dwarfout.c:1895: warning: pointer cast may violate ISO C aliasing rules
gcc/except.c:1980: warning: pointer cast may violate ISO C aliasing rules
gcc/except.c:1987: warning: pointer cast may violate ISO C aliasing rules
gcc/expmed.c:4017: warning: pointer cast may violate ISO C aliasing rules
gcc/expmed.c:4020: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:4306: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5111: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5264: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5280: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5283: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5287: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5294: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5920: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5924: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5931: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5938: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5951: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5969: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5970: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5974: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:5980: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6134: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6136: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6138: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6139: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6141: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6143: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6779: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6781: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6788: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6817: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6818: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6913: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6914: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:6915: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:8205: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:8518: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:8528: warning: pointer cast may violate ISO C aliasing rules
gcc/expr.c:8551: warning: pointer cast may violate ISO C aliasing rules
gcc/fold-const.c:2212: warning: pointer cast may violate ISO C aliasing rules
gcc/fold-const.c:4157: warning: pointer cast may violate ISO C aliasing rules
gcc/fold-const.c:5307: warning: pointer cast may violate ISO C aliasing rules
gcc/fold-const.c:5356: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:1230: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:1445: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5185: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5266: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5297: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5303: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5343: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5356: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:5962: warning: pointer cast may violate ISO C aliasing rules
gcc/function.c:6088: warning: pointer cast may violate ISO C aliasing rules
gcc/ggc-common.c:289: warning: pointer cast may violate ISO C aliasing rules
gcc/ggc-common.c:293: warning: pointer cast may violate ISO C aliasing rules
gcc/ggc-common.c:294: warning: pointer cast may violate ISO C aliasing rules
gcc/ggc-common.c:300: warning: pointer cast may violate ISO C aliasing rules
gcc/haifa-sched.c:7414: warning: pointer cast may violate ISO C aliasing rules
gcc/haifa-sched.c:7415: warning: pointer cast may violate ISO C aliasing rules
gcc/haifa-sched.c:7416: warning: pointer cast may violate ISO C aliasing rules
gcc/libgcc2.c:3243: warning: pointer cast may violate ISO C aliasing rules
gcc/libgcc2.c:3249: warning: pointer cast may violate ISO C aliasing rules
gcc/libgcc2.c:3320: warning: pointer cast may violate ISO C aliasing rules
gcc/libgcc2.c:3326: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:3749: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:3763: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:3766: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:3890: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:3901: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:3906: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:4075: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:4313: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:4314: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:5547: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:5548: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:6496: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:6502: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:6714: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:6715: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:6759: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:7230: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:7232: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:7257: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:7259: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:8263: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:8264: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:8343: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:8344: warning: pointer cast may violate ISO C aliasing rules
gcc/loop.c:8829: warning: pointer cast may violate ISO C aliasing rules
gcc/stmt.c:2035: warning: pointer cast may violate ISO C aliasing rules
gcc/stmt.c:2036: warning: pointer cast may violate ISO C aliasing rules
gcc/stor-layout.c:1247: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2215: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2217: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2225: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2227: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2421: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2431: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2436: warning: pointer cast may violate ISO C aliasing rules
gcc/tree.c:2533: warning: pointer cast may violate ISO C aliasing rules
gcc/unroll.c:1871: warning: pointer cast may violate ISO C aliasing rules
gcc/unroll.c:2418: warning: pointer cast may violate ISO C aliasing rules
gcc/unroll.c:2432: warning: pointer cast may violate ISO C aliasing rules
gcc/unroll.c:2435: warning: pointer cast may violate ISO C aliasing rules
gcc/unroll.c:4007: warning: pointer cast may violate ISO C aliasing rules
gcc/varasm.c:3290: warning: pointer cast may violate ISO C aliasing rules
gcc/varasm.c:3291: warning: pointer cast may violate ISO C aliasing rules
gcc/varasm.c:3398: warning: pointer cast may violate ISO C aliasing rules
gcc/varasm.c:3420: warning: pointer cast may violate ISO C aliasing rules


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]