Author: sebor
Date: Sat Sep  6 10:59:18 2008
New Revision: 692697

URL: http://svn.apache.org/viewvc?rev=692697&view=rev
Log:
2008-09-06  Martin Sebor  <[EMAIL PROTECTED]>

        STDCXX-1011
        * src/collate.cpp (collate_byname::do_transform): Silenced HP aCC
        warning #20200: Potential null pointer dereference through return
        of call to __rw::__rw_get_facet_data().
        Optimized the initialization of the facet data so as to take place
        only in the first iteration of the loop in which it's needed, and
        not each time.

Modified:
    stdcxx/branches/4.2.x/src/collate.cpp

Modified: stdcxx/branches/4.2.x/src/collate.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/src/collate.cpp?rev=692697&r1=692696&r2=692697&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/src/collate.cpp (original)
+++ stdcxx/branches/4.2.x/src/collate.cpp Sat Sep  6 10:59:18 2008
@@ -966,6 +966,10 @@
     // each character, in the process check for collating elements.
     const char* tmp_lo = low;
 
+    // lazily initialized in the first iteration of the loop
+    // in which the facet data is needed (possibly never)
+    const _RW::__rw_codecvt_t* cvt = 0;
+
     for (; tmp_lo < high; tmp_lo++) {
         const char* tmp_lo2 = tmp_lo;
         int ret = _RW::__rw_get_n_ce_offset (impl, &tmp_lo2, high);
@@ -983,18 +987,22 @@
                 if (impl->undefined_optimization) {
 
                     size_t size;
+                    if (0 == cvt) {
+                        cvt = _RWSTD_STATIC_CAST (const _RW::__rw_codecvt_t*, 
+                                                  _RW::__rw_get_facet_data (
+                                                      ccvt_cat, size, _C_name, 
+                                                      impl->codeset_name ()));
 
-                    const _RW::__rw_codecvt_t *cvt = 
-                        _RWSTD_STATIC_CAST (const _RW::__rw_codecvt_t*, 
-                                            _RW::__rw_get_facet_data (
-                                                ccvt_cat, size, _C_name, 
-                                                impl->codeset_name ()));
+                        if (0 == cvt)
+                            return string_type ();   // error
+                    }
 
                     if (_RW::__rw_is_invalid (cvt->n_to_w_tab(), tmp_lo2))
-                        return 0;
+                        return string_type ();   // error
 
-                    const unsigned int *pwt =
+                    const unsigned int* const pwt =
                         impl->get_weight (impl->undefined_weight_idx);
+
                     indexes.append (&pwt, 1);
 
                     tmp_lo = tmp_lo2;
@@ -1194,6 +1202,10 @@
         // is high - low
         _RW::__rw_pod_array<const unsigned int*, 1024> indexes;
 
+        // lazily initialized in the first iteration of the loop
+        // in which the facet data is needed (possibly never)
+        const _RW::__rw_codecvt_t* cvt = 0;
+
         // first go through the string getting a weight offset for
         // each character, in the process check for collating elements.
         for (const wchar_t* tmp_lo =low; tmp_lo < high; tmp_lo++) {
@@ -1211,11 +1223,17 @@
                     // database to discover this information 
                     if (impl->undefined_optimization) {
                         size_t size;
-                        const _RW::__rw_codecvt_t *cvt = 
-                            _RWSTD_STATIC_CAST (const _RW::__rw_codecvt_t*, 
-                                                _RW::__rw_get_facet_data (
-                                                    ccvt_cat, size, _C_name,
-                                                    impl->codeset_name ()));
+
+
+                        if (0 == cvt) {
+                            cvt = _RWSTD_STATIC_CAST(const 
_RW::__rw_codecvt_t*,
+                                                     _RW::__rw_get_facet_data (
+                                                        ccvt_cat, size, 
_C_name,
+                                                        impl->codeset_name 
()));
+
+                            if (0 == cvt)
+                                return string_type ();   // error
+                        }
 
                         char tmp [_RWSTD_MB_MAX];
 


Reply via email to