Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index


On Tuesday 09 of August 2011, Stephan Bergmann wrote:
On Aug 6, 2011, at 3:32 PM, Maciej Rumianowski wrote:
@@ -1325,7 +1288,7 @@ String
SvxNumberFormatShell::GetComment4Entry(short nEntry) if(nEntry < 0)
        return String();

-    if(nEntry<aCurEntryList.Count())
+    if(nEntry < (short)aCurEntryList.size())
    {

5. Should short type be replaced with sal_Int16 or more appropriate type?

Some C++ compilers warn about comparisons like (x < y) where x is an rvalue
of a signed integral type and y is an rvalue of an unsigned integral type. 
And, in general, they are right in doing so:  Assume that x is an rvalue -1
of type int and y is some rvalue of type unsigned int.  Usual arithmetic
conversion causes the int -1 to be converted to unsigned int. Undefined
behavior, hard-disk erased.  Oops.

 Correct.

However, if the programmer can prove that x is always non-negative in the
above comparison, there is usually an easy solution to that problem:

[skipped a description of the typical OOo style of using a sledge hammer to 
punch in a nail that's anything but easy and can potentially cause almost as 
much trouble as it solves]

 Actually a much better solution to the problem is to realize that 'unsigned' 
belongs together with other legacy stuff and is just not worth it, perhaps 
except for bitfields (which are kind of legacy stuff these days as well).

 If the extra bit of value is really needed, then it's usually much better to 
go for a larger type (as 'unsigned' does not mean it has any magic range 
checks included), otherwise just going with plain 'int' simply does the job. 
Too bad usage of STL drags in these problems, but that's not a problem that 
couldn't be solved. Certainly much easier than having code cluttered with 
checks and casts that serve no real purpose.

-- 
 Lubos Lunak
 l.lunak@suse.cz

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.