What should "*nft = *(struct need_to_free *) ntf->addr;" do?

Pete Delany pete at sinix.UUCP
Thu Aug 23 03:31:42 AEST 1990


    Would someone forward this to Dennis Ritchie, unfortunately I havn't his
    e-mail address.  I just made a 100DM bet that the code found in heap_kmem.c
    check_need_to_free() is correct where it copies a structure pointed to by
    a structure onto the first structure with structure assignment:
    {
	struct need_to_free {
		struct need_to_free	*addr;
		int			nbytes;
		} *ntf = &kmem_info.need_to_free_list;

	*ntf = *(struct need_to_free *) ntf->addr;
    }

	        +-------------+        +------------+        +-------------+
		|             |        |            |        |             |
	ntf ->	|  addr p1 ----------> |   addr p2 ------->  |    addr p3  |
		|             |        |            |        |             |
		+-------------+        +------------+        +-------------+
		|             |        |            |        |             |
		|  nbytes n1  |        |  nbytes n2 |        |  nbytes n3  |
		|             |        |            |        |             |
		+-------------+        +------------+        +-------------+


    So after the structure should the data structure look like my humble view:
							       ==============

	        +-------------+        +------------+        +-------------+
		|             |        |            |        |             |
	ntf ->	|  addr p2 ----------> |   addr p3 ------->  |    addr p4  |
		|             |        |            |        |             |
		+-------------+        +------------+        +-------------+
		|             |        |            |        |             |
		|  nbytes n2  |        |  nbytes n3 |        |  nbytes n4  |
		|             |        |            |        |             |
		+-------------+        +------------+        +-------------+

    or like my friend thinks "undeterministic", and is this case 
    generating code that leaves the structures looking like:

	        +-------------+        +------------+        +-------------+
		|             |        |            |        |             |
	ntf ->	|  addr p2 ----------> |   addr p3 ------->  |    addr p4  |
		|             |        |            |        |             |
		+-------------+        +------------+        +-------------+
		|             |        |            |        |             |
		|  nbytes n3  |        |  nbytes n4 |        |  nbytes n5  |
		|             |        |            |        |             |
		+-------------+        +------------+        +-------------+


    is just a "feature". Ckecking out the ANSII Oct 31 '88 spec says:

	"If the value being stored in an object is accessed from another 
	object that overlaps in any way the storage of the first object, 
	then the overlap shall be exact and the two objects shall have
	qualified or unqualified versions of a compatible type; 
	otherwise the behavior is undefined"

	Now to better understand this let us assume:
	============================================
	1. a structure and an object are the same thing,
	   object is just a OSI'ish term,

	2. "in any way" add nothing to the logic of the statement,

	3. "ANYTHING or unANYTHING" add nothing to the meaning,

	4. overlap storage means overlaping in memory, not symboliclly
	   in the intermediate language of the compiler or it's authors,

	Then we get the following slightly more understandable statement:
	=================================================================
	"If the data being stored in a structure is accessed from another 
	structure that overlaps the memory storage of the first structure, 
	then the overlap shall be exact and the two structures shall have
	versions of a compatible type; otherwise the behavior is undefined"

	Now, breaking it into it's structural components, we get:
	=========================================================

	"If 	the data being stored in a structure is accessed 
		from another structure : TRUE
	and  
		that data overlaps the memory storage of the 
		first structure : TRUE, 
     
	then  
		the overlap shall be exact: TRUE 
		and the two structures shall have
		versions of a compatible type; :TRUE
	      
	otherwise  
		"the behavior is undefined"


	This this reduces to:
		if(TRUE && TRUE) 
			TRUE;	/* OK */
		
	So  my interpretation is the behavior is OK.  How about
	it Dennis?  I talked to you about 15 years ago when I was
	upgrading our V6 Honewell Compiler to V7 to do structure 
	assignment and think it would have done it as I see reasonable
	now. System V, BSD4.3, Sun, and Vax compiler seem to have 
	avoided this bug, so I assume most people expect the structure
	to be assigned as if done with bcopy().  

	I don't see the fix being as easy as on Steve Bunches,
	Dennis's or Johnsons compilers but I do feel it
	is a bug and not a "feature". What do you guys think?

	How many people know of existing code that uses this 
	kind of assumpion? Is there much code out there.  This
	kmem_alloc() bug has been irritating me for almost a year

SUMMARY:
	Want opinions from C compiler guru's about what "C" should do.  
	I currently think Dennis is the best authority on C. How about
	our C++ gurus at the Labs; what should C++ do?  And last, but not
	least, how about our ANSII C committee types, am I interpreting 
	your gospel as it was intended by the almighty? If not a lexical
	breakdown might be insighfull. 

DISCLAIMER:
	Of course my opinion is not likely the same as Siemens, 
	Nixdorf, OSI, ANSII, XOPEN, OSF, or any of the world authorities.
	However opinions from all are appreciated, especially those
	helping me win my 100 DM. :-)



More information about the Comp.lang.c mailing list