summaryrefslogtreecommitdiff
path: root/sal/inc
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@suse.cz>2012-12-03 16:06:16 +0100
committerLuboš Luňák <l.lunak@suse.cz>2012-12-03 18:04:24 +0100
commit5db72152fe67c7f538f67c284b6767a52c12aa69 (patch)
treebfd43ed2cec5d0bd450a065c8c477c95663f480c /sal/inc
parent084a2c52c27a095bf32815512340b485c5b05eaf (diff)
assert on strange lengths of string literals
It's better to detect corner cases this way rather than get possibly incorrect results. And strlen() should be easy to optimize out for string literals. Change-Id: Id762e256207668a0cbefe4e13d5f2067f373e783
Diffstat (limited to 'sal/inc')
-rw-r--r--sal/inc/rtl/strbuf.hxx3
-rw-r--r--sal/inc/rtl/string.hxx11
-rw-r--r--sal/inc/rtl/stringconcat.hxx2
-rw-r--r--sal/inc/rtl/stringutils.hxx2
-rw-r--r--sal/inc/rtl/ustrbuf.hxx6
-rw-r--r--sal/inc/rtl/ustring.hxx26
6 files changed, 46 insertions, 4 deletions
diff --git a/sal/inc/rtl/strbuf.hxx b/sal/inc/rtl/strbuf.hxx
index 945d1d2b179a..5efd0557430e 100644
--- a/sal/inc/rtl/strbuf.hxx
+++ b/sal/inc/rtl/strbuf.hxx
@@ -196,6 +196,7 @@ public:
: pData(NULL)
, nCapacity( internal::ConstCharArrayDetector< T, void >::size - 1 + 16 )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_string_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 16 );
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
@@ -463,6 +464,7 @@ public:
typename internal::ConstCharArrayDetector< T, OStringBuffer& >::Type append( T& literal )
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_stringbuffer_insert( &pData, &nCapacity, getLength(), literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
return *this;
}
@@ -652,6 +654,7 @@ public:
typename internal::ConstCharArrayDetector< T, OStringBuffer& >::Type insert( sal_Int32 offset, T& literal )
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_stringbuffer_insert( &pData, &nCapacity, offset, literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
return *this;
}
diff --git a/sal/inc/rtl/string.hxx b/sal/inc/rtl/string.hxx
index a2cee5153d2f..2c7a43dba897 100644
--- a/sal/inc/rtl/string.hxx
+++ b/sal/inc/rtl/string.hxx
@@ -202,6 +202,7 @@ public:
template< typename T >
OString( T& literal, typename internal::ConstCharArrayDetector< T, internal::Dummy >::Type = internal::Dummy() ) SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
pData = 0;
rtl_string_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
#ifdef RTL_STRING_UNITTEST
@@ -295,6 +296,7 @@ public:
typename internal::ConstCharArrayDetector< T, OString& >::Type operator=( T& literal ) SAL_THROW(())
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_string_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
return *this;
}
@@ -529,6 +531,7 @@ public:
typename internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const SAL_THROW(())
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
if ( pData->length != internal::ConstCharArrayDetector< T, void >::size - 1 )
return false;
return rtl_str_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length,
@@ -594,6 +597,7 @@ public:
typename internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rtl_str_shortenedCompare_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex,
literal, internal::ConstCharArrayDetector< T, void >::size - 1, internal::ConstCharArrayDetector< T, void >::size - 1) == 0;
@@ -666,6 +670,7 @@ public:
typename internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
literal, internal::ConstCharArrayDetector< T, void >::size - 1, internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
}
@@ -720,6 +725,7 @@ public:
typename internal::ConstCharArrayDetector< T, bool >::Type endsWith( T& literal ) const
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return internal::ConstCharArrayDetector< T, void >::size - 1 <= getLength()
&& match(literal, getLength() - ( internal::ConstCharArrayDetector< T, void >::size - 1 ));
}
@@ -788,6 +794,7 @@ public:
friend typename internal::ConstCharArrayDetector< T, bool >::Type operator==( const OString& rStr, T& literal ) SAL_THROW(())
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rStr.getLength() == internal::ConstCharArrayDetector< T, void >::size - 1
&& rtl_str_compare_WithLength( rStr.pData->buffer, rStr.pData->length, literal,
internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
@@ -802,6 +809,7 @@ public:
friend typename internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OString& rStr ) SAL_THROW(())
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rStr.getLength() == internal::ConstCharArrayDetector< T, void >::size - 1
&& rtl_str_compare_WithLength( rStr.pData->buffer, rStr.pData->length, literal,
internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
@@ -946,6 +954,7 @@ public:
typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
{
RTL_STRING_CONST_FUNCTION
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
sal_Int32 n = rtl_str_indexOfStr_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex, literal, internal::ConstCharArrayDetector< T, void >::size - 1);
return n < 0 ? n : n + fromIndex;
@@ -1466,7 +1475,7 @@ This class is not part of public API and is meant to be used only in LibreOffice
struct SAL_WARN_UNUSED OStringLiteral
{
template< int N >
- OStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str ) {}
+ OStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
int size;
const char* data;
};
diff --git a/sal/inc/rtl/stringconcat.hxx b/sal/inc/rtl/stringconcat.hxx
index fddf6ed49b6f..9fb95680faa7 100644
--- a/sal/inc/rtl/stringconcat.hxx
+++ b/sal/inc/rtl/stringconcat.hxx
@@ -128,7 +128,7 @@ struct ToStringHelper< char[ N ] >
template< int N >
struct ToStringHelper< const char[ N ] >
{
- static int length( const char[ N ] ) { return N - 1; }
+ static int length( const char str[ N ] ) { assert( strlen( str ) == N - 1 ); return N - 1; }
static char* addData( char* buffer, const char str[ N ] ) { return addDataHelper( buffer, str, N - 1 ); }
static sal_Unicode* addData( sal_Unicode* buffer, const char str[ N ] ) { return addDataLiteral( buffer, str, N - 1 ); }
static const bool allowOStringConcat = true;
diff --git a/sal/inc/rtl/stringutils.hxx b/sal/inc/rtl/stringutils.hxx
index b1e19e5327b1..c6e44b66d4b1 100644
--- a/sal/inc/rtl/stringutils.hxx
+++ b/sal/inc/rtl/stringutils.hxx
@@ -124,7 +124,7 @@ struct NonConstCharArrayDetector< const char[], T >
};
#endif
-template< typename T1, typename T2 >
+template< typename T1, typename T2 = void >
struct ConstCharArrayDetector
{
static const bool ok = false;
diff --git a/sal/inc/rtl/ustrbuf.hxx b/sal/inc/rtl/ustrbuf.hxx
index 7d36356cd404..06d906e864eb 100644
--- a/sal/inc/rtl/ustrbuf.hxx
+++ b/sal/inc/rtl/ustrbuf.hxx
@@ -150,6 +150,7 @@ public:
: pData(NULL)
, nCapacity( N - 1 + 16 )
{
+ assert( strlen( literal ) == N - 1 );
rtl_uString_newFromLiteral( &pData, literal, N - 1, 16 );
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
@@ -179,6 +180,7 @@ public:
: pData(NULL)
, nCapacity( internal::ConstCharArrayDetector< T, void >::size - 1 + 16 )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uString_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 16 );
#ifdef RTL_STRING_UNITTEST
rtl_string_unittest_const_literal = true;
@@ -480,6 +482,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type append( T& literal )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, getLength(), literal,
internal::ConstCharArrayDetector< T, void >::size - 1 );
return *this;
@@ -740,6 +743,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, OUStringBuffer& >::Type insert( sal_Int32 offset, T& literal )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uStringbuffer_insert_ascii( &pData, &nCapacity, offset, literal,
internal::ConstCharArrayDetector< T, void >::size - 1 );
return *this;
@@ -1097,6 +1101,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex, literal,
internal::ConstCharArrayDetector< T, void >::size - 1);
@@ -1159,6 +1164,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rtl_ustr_lastIndexOfAscii_WithLength(
pData->buffer, pData->length, literal, internal::ConstCharArrayDetector< T, void >::size - 1);
}
diff --git a/sal/inc/rtl/ustring.hxx b/sal/inc/rtl/ustring.hxx
index ec7c29009d55..534bd889f05a 100644
--- a/sal/inc/rtl/ustring.hxx
+++ b/sal/inc/rtl/ustring.hxx
@@ -198,6 +198,9 @@ public:
template< int N >
OUString( const char (&literal)[ N ] )
{
+ // Check that the string literal is in fact N - 1 long (no embedded \0's),
+ // any decent compiler should optimize out calls to strlen with literals.
+ assert( strlen( literal ) == N - 1 );
pData = 0;
rtl_uString_newFromLiteral( &pData, literal, N - 1, 0 );
#ifdef RTL_STRING_UNITTEST
@@ -225,6 +228,7 @@ public:
template< typename T >
OUString( T& literal, typename internal::ConstCharArrayDetector< T, internal::Dummy >::Type = internal::Dummy() )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
pData = 0;
rtl_uString_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
#ifdef RTL_STRING_UNITTEST
@@ -381,6 +385,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, OUString& >::Type operator=( T& literal )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uString_newFromLiteral( &pData, literal, internal::ConstCharArrayDetector< T, void >::size - 1, 0 );
return *this;
}
@@ -571,6 +576,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type equalsIgnoreAsciiCase( T& literal ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
if ( pData->length != internal::ConstCharArrayDetector< T, void >::size - 1 )
return sal_False;
@@ -606,6 +612,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type match( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rtl_ustr_ascii_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
literal, internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
}
@@ -643,6 +650,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type matchIgnoreAsciiCase( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex,
literal, internal::ConstCharArrayDetector< T, void >::size - 1 ) == 0;
}
@@ -933,6 +941,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type startsWith( T& literal ) const
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
&& rtl_ustr_asciil_reverseEquals_WithLength( pData->buffer, literal,
internal::ConstCharArrayDetector< T, void >::size - 1);
@@ -964,6 +973,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type startsWithIgnoreAsciiCase( T& literal ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
pData->buffer,
internal::ConstCharArrayDetector< T, void >::size - 1, literal,
@@ -994,6 +1004,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type endsWith( T& literal ) const
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
&& rtl_ustr_asciil_reverseEquals_WithLength(
pData->buffer + pData->length - ( internal::ConstCharArrayDetector< T, void >::size - 1 ), literal,
@@ -1047,6 +1058,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, bool >::Type endsWithIgnoreAsciiCase( T& literal ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return internal::ConstCharArrayDetector< T, void >::size - 1 <= pData->length
&& (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
pData->buffer + pData->length - ( internal::ConstCharArrayDetector< T, void >::size - 1 ),
@@ -1108,6 +1120,7 @@ public:
template< typename T >
friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator==( const OUString& string, T& literal )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
}
/**
@@ -1120,6 +1133,7 @@ public:
template< typename T >
friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator==( T& literal, const OUString& string )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
}
/**
@@ -1132,6 +1146,7 @@ public:
template< typename T >
friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator!=( const OUString& string, T& literal )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return !string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
}
/**
@@ -1144,6 +1159,7 @@ public:
template< typename T >
friend inline typename internal::ConstCharArrayDetector< T, bool >::Type operator!=( T& literal, const OUString& string )
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return !string.equalsAsciiL( literal, internal::ConstCharArrayDetector< T, void >::size - 1 );
}
@@ -1239,6 +1255,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type indexOf( T& literal, sal_Int32 fromIndex = 0 ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
sal_Int32 ret = rtl_ustr_indexOfAscii_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex, literal,
internal::ConstCharArrayDetector< T, void >::size - 1);
@@ -1337,6 +1354,7 @@ public:
template< typename T >
typename internal::ConstCharArrayDetector< T, sal_Int32 >::Type lastIndexOf( T& literal ) const SAL_THROW(())
{
+ assert( strlen( literal ) == internal::ConstCharArrayDetector< T >::size - 1 );
return rtl_ustr_lastIndexOfAscii_WithLength(
pData->buffer, pData->length, literal, internal::ConstCharArrayDetector< T, void >::size - 1);
}
@@ -1517,6 +1535,7 @@ public:
{
rtl_uString * s = 0;
sal_Int32 i = 0;
+ assert( strlen( from ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uString_newReplaceFirstAsciiL(
&s, pData, from, internal::ConstCharArrayDetector< T, void >::size - 1, to.pData, index == 0 ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
@@ -1546,6 +1565,8 @@ public:
{
rtl_uString * s = 0;
sal_Int32 i = 0;
+ assert( strlen( from ) == internal::ConstCharArrayDetector< T1 >::size - 1 );
+ assert( strlen( to ) == internal::ConstCharArrayDetector< T2 >::size - 1 );
rtl_uString_newReplaceFirstAsciiLAsciiL(
&s, pData, from, internal::ConstCharArrayDetector< T1, void >::size - 1, to,
internal::ConstCharArrayDetector< T2, void >::size - 1, index == 0 ? &i : index);
@@ -1590,6 +1611,7 @@ public:
typename internal::ConstCharArrayDetector< T, OUString >::Type replaceAll( T& from, OUString const & to) const
{
rtl_uString * s = 0;
+ assert( strlen( from ) == internal::ConstCharArrayDetector< T >::size - 1 );
rtl_uString_newReplaceAllAsciiL(&s, pData, from, internal::ConstCharArrayDetector< T, void >::size - 1, to.pData);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -1612,6 +1634,8 @@ public:
replaceAll( T1& from, T2& to ) const
{
rtl_uString * s = 0;
+ assert( strlen( from ) == internal::ConstCharArrayDetector< T1 >::size - 1 );
+ assert( strlen( to ) == internal::ConstCharArrayDetector< T2 >::size - 1 );
rtl_uString_newReplaceAllAsciiLAsciiL(
&s, pData, from, internal::ConstCharArrayDetector< T1, void >::size - 1,
to, internal::ConstCharArrayDetector< T2, void >::size - 1);
@@ -2094,7 +2118,7 @@ This class is not part of public API and is meant to be used only in LibreOffice
struct SAL_WARN_UNUSED OUStringLiteral
{
template< int N >
- OUStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str ) {}
+ OUStringLiteral( const char (&str)[ N ] ) : size( N - 1 ), data( str ) { assert( strlen( str ) == N - 1 ); }
int size;
const char* data;
};