| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			bryant@balancebitsconsult
 
 
  Joined: 21 Nov 2023 Posts: 38
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| COPY_ARRAY Macro | 
			 
			
				 Posted: Thu Dec 07, 2023 6:45 pm     | 
				     | 
			 
			
				
  | 
			 
			
				So, there seems to be a COPY_ARRAY()  macro.  Undocumented ?
 
 
Anyone know what it does ?  How it works ?  I am running into it. | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Dec 08, 2023 3:03 am     | 
				     | 
			 
			
				
  | 
			 
			
				I don't think it does.
 
I think you are including something that defines this, and are then trying
 
to define a second copy.
 
Possibly you have included a library from some other source that defines
 
this?. 
 
I Just tried creating a macro with this name on a few different projects,
 
and none complain that I am redefining a name, and the macros all work
 
OK. 
 
What is happening?.
 
What error are you getting?.
 
 
I seem to remember MicroChip having a copy_array function or macro in
 
one of their libraries. | 
			 
		  | 
	
	
		  | 
	
	
		
			bryant@balancebitsconsult
 
 
  Joined: 21 Nov 2023 Posts: 38
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Dec 08, 2023 10:54 am     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Ttelmah wrote: | 	 		  I don't think it does.
 
I think you are including something that defines this, and are then trying
 
to define a second copy.
 
Possibly you have included a library from some other source that defines
 
this?. 
 
I Just tried creating a macro with this name on a few different projects,
 
and none complain that I am redefining a name, and the macros all work
 
OK. 
 
What is happening?.
 
What error are you getting?.
 
 
I seem to remember MicroChip having a copy_array function or macro in
 
one of their libraries. | 	  
 
 
I have added it to a repo to examine.  I was seeing errors when disabling case insensitivity at the top of util.h (link) : https://github.com/beadon/circbuf_demo/blob/main/util.h
 
 
Now, strangely, I am unable to reproduce the errors triggered by the case change!  So, I will take further steps to reproduce and reply on this thread.  I have a separate issue in defining the macro - it MIGHT be related --
 
 
errors are :
 
 
 	  | Code: | 	 		  
 
Compiling C:\Users\beadon\Documents\GitHub\circbuf_demo\main on 08-Dec-23 at 08:49
 
*** Error 9 "C:\Users\beadon\Documents\GitHub\circbuf_demo\util.h" Line 95(31,37): Macro identifier requires parameters
 
*** Error 12 "C:\Users\beadon\Documents\GitHub\circbuf_demo\util.h" Line 95(37,38): Undefined identifier   val
 
      2 Errors,  0 Warnings.
 
Build Failed.
 
 | 	  
 
 
Which, at a glance, seems trivial to resolve.  Once you look at the line though, there's no "val" and the error message becomes more puzzling.
 
 
 	  | Code: | 	 		  | #define unsigned_mult_overflows(a, b) ((a) && (b) > maximum_unsigned_value_of_type(a) / (a))  | 	  
 
 
Any insights are appreciated. | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Dec 08, 2023 11:29 am     | 
				     | 
			 
			
				
  | 
			 
			
				Two things.
 
 
The first is what is line 95 (and a couple of lines in front)?. 
 
The second ties to the second part of the above. The compilers fault 
 
identifier code has a habit of misidentifying problems. It goes wrong several 
 
lines after the actual fault, when it can no longer carry on. So an 
 
unidentified fault gets reported as a completely different fault lots later.
 
This is why sometimes using a C syntax scanner tool can be a way of
 
finding the real problem. | 
			 
		  | 
	
	
		  | 
	
	
		
			Ttelmah
 
 
  Joined: 11 Mar 2010 Posts: 19967
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Fri Dec 08, 2023 12:43 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Change the word 'unsigned' in your value there to something like 'uns'.
 
unsigned is a keyword, and in general keywords should not be used like this.
 
 
Looking at it more. I wonder how maximum_unsigned_value_of_type is
 
coded?. My guess would be that it is a macro, that possibly uses sizeof
 
to read a value from an array containing the size limits for the integer 
 
types. You have a significant danger when coding macros inside macros,
 
that you can take the resulting line length over the maximum supported 
 
by the compiler.
 
 
What overflow are you actually trying to test?.
 
 
 	  | Code: | 	 		  
 
//check whether a*x could overflow
 
 
// If one number is -1 and another is INT_MIN, multiplying them we get 
 
// abs(INT_MIN) which is 1 higher than INT_MAX
 
if (a == -1 && x == INT_MIN) // `a * x` can overflow
 
if (x == -1 && a == INT_MIN) // `a * x` (or `a / x`) can overflow
 
// general case
 
if (x != 0 && a > INT_MAX / x) // `a * x` would overflow
 
if (x != 0 && a < INT_MIN / x) // `a * x` would underflow
 
 | 	  
 
Using your macro for the MAX, you should bracket round this since 
 
otherwise the expansion may not be as you expect. | 
			 
		  | 
	
	
		  | 
	
	
		 |