[Libreoffice-commits] core.git: 6 commits - idlc/inc idlc/source l10ntools/source sal/rtl solenv/bin soltools/cpp

Stephan Bergmann sbergman at redhat.com
Wed Aug 21 22:14:22 PDT 2013


 idlc/inc/idlc/aststruct.hxx   |    8 +++---
 idlc/source/aststruct.cxx     |    6 ++--
 idlc/source/parser.y          |    4 +--
 l10ntools/source/xmlparse.cxx |    6 ++--
 sal/rtl/strtmpl.cxx           |   51 +++++++++++++++++++++---------------------
 solenv/bin/concat-deps.c      |   24 -------------------
 soltools/cpp/cpp.h            |    4 +--
 7 files changed, 40 insertions(+), 63 deletions(-)

New commits:
commit 8b5dc58a3e36370c7469e341ac0400cebd7e131c
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Aug 14 16:08:42 2013 +0200

    Misaligned access is always undefined behavior
    
    ...as flagged by Clang -fsanitize=undefined
    
    Change-Id: I924439b1546832ebc37b87d88279822b9b7b6c0d

diff --git a/solenv/bin/concat-deps.c b/solenv/bin/concat-deps.c
index b305d1a..f0147c8 100644
--- a/solenv/bin/concat-deps.c
+++ b/solenv/bin/concat-deps.c
@@ -16,25 +16,21 @@
 #ifdef __x86_64__
 #undef CORE_BIG_ENDIAN
 #define CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 64 /* big value -> no alignment */
 #else
 #define CORE_BIG_ENDIAN
 #undef CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 4
 #endif
 
 #endif
 #ifdef _AIX
 #define CORE_BIG_ENDIAN
 #undef CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 4
 #endif /* Def _AIX */
 
 #ifdef _MSC_VER
 #define __windows
 #undef CORE_BIG_ENDIAN
 #define CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 64 /* big value -> no alignment */
 #endif /* Def _MSC_VER */
 
 #if defined(__linux) || defined(__OpenBSD__) || \
@@ -44,16 +40,10 @@
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 #undef CORE_BIG_ENDIAN
 #define CORE_LITTLE_ENDIAN
-#if defined(__x86_64) || defined(__i386)
-#define USE_MEMORY_ALIGNMENT 64
-#else
-#define USE_MEMORY_ALIGNMENT 4
-#endif
 #else /* !(__BYTE_ORDER == __LITTLE_ENDIAN) */
 #if __BYTE_ORDER == __BIG_ENDIAN
 #define CORE_BIG_ENDIAN
 #undef CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 4
 #endif /* __BYTE_ORDER == __BIG_ENDIAN */
 #endif /* !(__BYTE_ORDER == __LITTLE_ENDIAN) */
 #endif /* Def __linux || Def *BSD */
@@ -62,22 +52,12 @@
 #ifdef __sparc
 #define CORE_BIG_ENDIAN
 #undef CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 4
 #else  /* Ndef __sparc */
 #undef CORE_BIG_ENDIAN
 #define CORE_LITTLE_ENDIAN
-#define USE_MEMORY_ALIGNMENT 4
 #endif /* Ndef __sparc */
 #endif /* Def __sun */
 
-/* Note USE_MEMORY_ALIGNMENT is 4 for platform that allow short non-aligned but required int access to be aligned (e.g sparc, ppc, zos..)
- *      USE_MEMORY_ALIGNMENT is 2 for platform that require short and int access to be aligned (e.g hppa )
- * if the platform does not have alignment requirement (x86/amd64) use a big value (i.e > 16)
- */
-#ifndef USE_MEMORY_ALIGNMENT
-#error "USE_MEMORY_ALIGNMENT must be defined to the proper alignment value for the platform"
-#endif
-
 #include <assert.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -136,9 +116,6 @@ int result = 32;
 }
 #endif
 
-#if (USE_MEMORY_ALIGNMENT > 4)
-#define get_unaligned_uint(str)           (*(unsigned int*)(str))
-#else
 static inline unsigned int get_unaligned_uint(const unsigned char* cursor)
 {
 unsigned int   result;
@@ -146,7 +123,6 @@ unsigned int   result;
     memcpy(&result, cursor, sizeof(unsigned int));
     return result;
 }
-#endif
 
 /* ===============================================
  * memory pool for fast fix-size allocation (non-tread-safe)
commit 76d5f993e53d4cd7cdbc16e318f36b58c17ed33b
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Aug 14 16:06:36 2013 +0200

    downcast of address which does not point to an object of type 'XMLParentNode'
    
    (note: object is of type 'XMLDefault'); Clang -fsanitize=undefined
    
    Change-Id: Idaa1e30068c389ed57977d40fc90410ec9ff3665

diff --git a/l10ntools/source/xmlparse.cxx b/l10ntools/source/xmlparse.cxx
index 40550bc..4203050 100644
--- a/l10ntools/source/xmlparse.cxx
+++ b/l10ntools/source/xmlparse.cxx
@@ -447,11 +447,11 @@ void XMLFile::SearchL10NElements( XMLParentNode *pCur , int pos)
     else {
         switch( pCur->GetNodeType()) {
             case XML_NODE_TYPE_FILE: {
-                XMLParentNode* pElement;
+                XMLChildNode* pElement;
                 if( GetChildList()){
                     for ( size_t i = 0; i < GetChildList()->size(); i++ ){
-                        pElement = (XMLParentNode*) (*GetChildList())[ i ];
-                        if( pElement->GetNodeType() ==  XML_NODE_TYPE_ELEMENT ) SearchL10NElements( pElement , i);
+                        pElement = (*GetChildList())[ i ];
+                        if( pElement->GetNodeType() ==  XML_NODE_TYPE_ELEMENT ) SearchL10NElements( (XMLParentNode*) pElement , i);
                     }
                 }
             }
commit 4ef1f4ae499cbac7e85b03abff5c2bb31c68b90f
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Aug 14 16:05:07 2013 +0200

    downcast of address which does not point to an object of type 'AstInterface'
    
    (note: object is of type 'AstTypeDef'); Clang -fsanitize=undefined
    
    Change-Id: I1b11a7678f18557c8040af2118c1c0101913f086

diff --git a/idlc/inc/idlc/aststruct.hxx b/idlc/inc/idlc/aststruct.hxx
index 837bbaf..e13229c 100644
--- a/idlc/inc/idlc/aststruct.hxx
+++ b/idlc/inc/idlc/aststruct.hxx
@@ -33,15 +33,15 @@ public:
     AstStruct(
         const OString& name,
         std::vector< OString > const & typeParameters,
-        AstStruct* pBaseType, AstScope* pScope);
+        AstStruct const* pBaseType, AstScope* pScope);
 
     AstStruct(const NodeType type,
               const OString& name,
-              AstStruct* pBaseType,
+              AstStruct const* pBaseType,
               AstScope* pScope);
     virtual ~AstStruct();
 
-    AstStruct* getBaseType()
+    AstStruct const* getBaseType()
         { return m_pBaseType; }
 
     DeclList::size_type getTypeParameterCount() const
@@ -53,7 +53,7 @@ public:
 
     virtual sal_Bool dump(RegistryKey& rKey);
 private:
-    AstStruct* m_pBaseType;
+    AstStruct const* m_pBaseType;
     DeclList m_typeParameters;
 };
 
diff --git a/idlc/source/aststruct.cxx b/idlc/source/aststruct.cxx
index fff256a..d60026a 100644
--- a/idlc/source/aststruct.cxx
+++ b/idlc/source/aststruct.cxx
@@ -27,7 +27,7 @@ using namespace ::rtl;
 
 AstStruct::AstStruct(
     const OString& name, std::vector< OString > const & typeParameters,
-    AstStruct* pBaseType, AstScope* pScope)
+    AstStruct const* pBaseType, AstScope* pScope)
     : AstType(NT_struct, name, pScope)
     , AstScope(NT_struct)
     , m_pBaseType(pBaseType)
@@ -42,7 +42,7 @@ AstStruct::AstStruct(
 
 AstStruct::AstStruct(const NodeType type,
                         const OString& name,
-                       AstStruct* pBaseType,
+                       AstStruct const* pBaseType,
                      AstScope* pScope)
     : AstType(type, name, pScope)
     , AstScope(type)
diff --git a/idlc/source/parser.y b/idlc/source/parser.y
index 7bfdea2..c149219 100644
--- a/idlc/source/parser.y
+++ b/idlc/source/parser.y
@@ -582,7 +582,7 @@ interface_dcl :
 		{
 			pInterface = new AstInterface(
                 *$1->getName(),
-                static_cast< AstInterface * >($1->getInherits()), pScope);
+                static_cast< AstInterface const * >(resolveTypedefs($1->getInherits())), pScope);
 			if ( pInterface &&
 				(pDecl = pScope->lookupByName(pInterface->getScopedName())) ) 
 			{
@@ -2586,7 +2586,7 @@ struct_type :
 
 		if ( pScope )
 		{
-			AstStruct* pBase= static_cast< AstStruct* >($1->getInherits());
+			AstStruct const* pBase= static_cast< AstStruct const* >(resolveTypedefs($1->getInherits()));
             pStruct = new AstStruct(
                 *$1->getName(), $1->getTypeParameters(), pBase, pScope);
 			pScope->addDeclaration(pStruct);
commit d239ee4fa43c3936aceff343085bd2c74c25605c
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Aug 14 16:02:04 2013 +0200

    downcast of address which does not point to an object of type 'AstType'
    
    (note: object is of type 'AstDeclaration'); Clang -fsanitize=undefined
    
    Change-Id: I08eef7d3e8b298abd16b0c6d72cfb72b75190cd5

diff --git a/idlc/source/aststruct.cxx b/idlc/source/aststruct.cxx
index 7f64556..fff256a 100644
--- a/idlc/source/aststruct.cxx
+++ b/idlc/source/aststruct.cxx
@@ -36,7 +36,7 @@ AstStruct::AstStruct(
          i != typeParameters.end(); ++i)
     {
         m_typeParameters.push_back(
-            new AstDeclaration(NT_type_parameter, *i, 0));
+            new AstType(NT_type_parameter, *i, 0));
     }
 }
 
commit e771d9248dfed643b4737d6a37af21b460bdf949
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Aug 14 15:57:47 2013 +0200

    Various undefined behavior involving signed integers
    
    as flagged by Clang -fsanitize=undefined
    
    Change-Id: Iff1aa4473d960009890b923fba734257ecd8b3ef

diff --git a/sal/rtl/strtmpl.cxx b/sal/rtl/strtmpl.cxx
index dc54945..496216f 100644
--- a/sal/rtl/strtmpl.cxx
+++ b/sal/rtl/strtmpl.cxx
@@ -22,9 +22,11 @@
 /* String-Class                                                            */
 /* ======================================================================= */
 
+#include <cassert>
+#include <limits>
+
 #include <string.h>
 #include <sal/log.hxx>
-#include <limits>
 #include <boost/static_assert.hpp>
 
 /*
@@ -278,13 +280,13 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCO
                                                             sal_Int32 nLen )
     SAL_THROW_EXTERN_C()
 {
-    sal_Int32 h = nLen;
+    sal_uInt32 h = static_cast<sal_uInt32>(nLen);
 
     if ( nLen < 256 )
     {
         while ( nLen > 0 )
         {
-            h = (h*37) + IMPL_RTL_USTRCODE( *pStr );
+            h = (h*37U) + IMPL_RTL_USTRCODE( *pStr );
             pStr++;
             nLen--;
         }
@@ -296,34 +298,34 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCO
 
         /* only sample some characters */
         /* the first 3, some characters between, and the last 5 */
-        h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pStr );
         pStr++;
-        h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pStr );
         pStr++;
-        h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pStr );
         pStr++;
 
         nSkip = nLen / 8;
         nLen -= 8;
         while ( nLen > 0 )
         {
-            h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
+            h = (h*39U) + IMPL_RTL_USTRCODE( *pStr );
             pStr += nSkip;
             nLen -= nSkip;
         }
 
-        h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pEndStr );
         pEndStr++;
-        h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pEndStr );
         pEndStr++;
-        h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pEndStr );
         pEndStr++;
-        h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pEndStr );
         pEndStr++;
-        h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
+        h = (h*39U) + IMPL_RTL_USTRCODE( *pEndStr );
     }
 
-    return h;
+    return static_cast<sal_Int32>(h);
 }
 
 /* ----------------------------------------------------------------------- */
@@ -752,8 +754,7 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
         *pStr = '-';
         pStr++;
         nLen++;
-        nValue = -n; /* FIXME this code is not portable for n == -2147483648
-                        (smallest negative value for sal_Int32) */
+        nValue = n == SAL_MIN_INT32 ? static_cast<sal_uInt32>(n) : -n;
     }
     else
         nValue = n;
@@ -807,9 +808,7 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
         *pStr = '-';
         pStr++;
         nLen++;
-        nValue = -n; /* FIXME this code is not portable for
-                        n == -9223372036854775808 (smallest negative value for
-                        sal_Int64) */
+        nValue = n == SAL_MIN_INT64 ? static_cast<sal_uInt64>(n) : -n;
     }
     else
         nValue = n;
@@ -914,13 +913,13 @@ sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
 
 /* ----------------------------------------------------------------------- */
 namespace {
-    template <typename T> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
+    template<typename T, typename U> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
                                                                      sal_Int16 nRadix )
     {
         BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_signed);
         sal_Bool    bNeg;
         sal_Int16   nDigit;
-        T           n = 0;
+        U           n = 0;
 
         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
             nRadix = 10;
@@ -968,7 +967,8 @@ namespace {
             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
             if ( nDigit < 0 )
                 break;
-            if( ( nMod < nDigit ? nDiv-1 : nDiv ) < n )
+            assert(nDiv > 0);
+            if( static_cast<U>( nMod < nDigit ? nDiv-1 : nDiv ) < n )
                 return 0;
 
             n *= nRadix;
@@ -978,9 +978,10 @@ namespace {
         }
 
         if ( bNeg )
-            return -n;
+            return n == static_cast<U>(std::numeric_limits<T>::min())
+                ? std::numeric_limits<T>::min() : -static_cast<T>(n);
         else
-            return n;
+            return static_cast<T>(n);
     }
 }
 
@@ -988,14 +989,14 @@ sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
                                                 sal_Int16 nRadix )
     SAL_THROW_EXTERN_C()
 {
-    return IMPL_RTL_STRNAME( toInt )<sal_Int32>(pStr, nRadix);
+    return IMPL_RTL_STRNAME( toInt )<sal_Int32, sal_uInt32>(pStr, nRadix);
 }
 
 sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
                                                 sal_Int16 nRadix )
     SAL_THROW_EXTERN_C()
 {
-    return IMPL_RTL_STRNAME( toInt )<sal_Int64>(pStr, nRadix);
+    return IMPL_RTL_STRNAME( toInt )<sal_Int64, sal_uInt64>(pStr, nRadix);
 }
 
 /* ----------------------------------------------------------------------- */
commit 376feb6a6fcd32887b50fba790a3230baf3dae98
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Wed Aug 14 15:54:46 2013 +0200

    left shift of 1 by 31 places cannot be represented in type 'int'
    
    Clang -fsanitize=undefined
    
    Change-Id: I2b3f1bd28e098d5eb57892d2c7438c18c5c3b357

diff --git a/soltools/cpp/cpp.h b/soltools/cpp/cpp.h
index 29a77ee..15c2e60 100644
--- a/soltools/cpp/cpp.h
+++ b/soltools/cpp/cpp.h
@@ -127,8 +127,8 @@ typedef struct wraplist
 }   Wraplist;
 
 #define new(t)  (t *)domalloc(sizeof(t))
-#define quicklook(a,b)  (namebit[(a)&077] & (1<<((b)&037)))
-#define quickset(a,b)   namebit[(a)&077] |= (1<<((b)&037))
+#define quicklook(a,b)  (namebit[(a)&077] & (1U<<((b)&037)))
+#define quickset(a,b)   namebit[(a)&077] |= (1U<<((b)&037))
 extern unsigned long namebit[077 + 1];
 
 enum errtype


More information about the Libreoffice-commits mailing list