You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4net-dev@logging.apache.org by "Ron Grabowski (JIRA)" <ji...@apache.org> on 2006/09/25 04:51:52 UTC

[jira] Commented: (LOG4NET-95) Level.CompareTo() may result a wrong Value -> sorting of Levels does not work

    [ http://issues.apache.org/jira/browse/LOG4NET-95?page=comments#action_12437433 ] 
            
Ron Grabowski commented on LOG4NET-95:
--------------------------------------

The CompareTo fix seems ok. I suspect subtraction was a clever way to save some cpu cycles.

FYI, Mono uses < and > instead of subtraction:

 http://svn.myrealbox.com/viewcvs/*checkout*/trunk/mcs/class/corlib/System/Int32.cs

 int xv = (int) v;
 if (m_value == xv)
  return 0;
 if (m_value > xv)
  return 1;
 else
  return -1;

Another solution would be to add a comment to the Level constructor and throw an ArgumentException for level values less than zero. There are 10,000 positive numbers between 0 and the lowest built-in log4net Level.

Since we know the two items we're comparing are ints, I think the inlined if/if/else block might save some cycles over CompareTo.

> Level.CompareTo() may result a wrong Value -> sorting of Levels does not work
> -----------------------------------------------------------------------------
>
>                 Key: LOG4NET-95
>                 URL: http://issues.apache.org/jira/browse/LOG4NET-95
>             Project: Log4net
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 1.2.10
>         Environment: VS2005 C#
>            Reporter: Bernd Klaiber
>            Priority: Minor
>
> I want to show a sorted list of available Levels.
> The sort routine uses Level.Compare(Level l, Level r).
> The result might be wrong when comparing ALL to another Level, because there is an overflow when just subtracting the m_levelValue.
> try to call the integer compare method:
> Level.cs:
> 		public static int Compare(Level l, Level r)
> 		{
> 			...
>                         //orig: return l.m_levelValue - r.m_levelValue;  -> bug when int overflow
> 			return l.m_levelValue.CompareTo(r.m_levelValue);
> 		}
> hope this helps.
> best regards, Bernd.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira