Martin Sebor
Thu, 03 Apr 2008 16:15:58 -0700
Eric Lemings wrote:
Travis,If you could, give the following patch a whirl (or quick review at least).
Is there an easier way to silence the warning than by adding all these loops? E.g., by assigning the address of the first member to a local pointer? (Or is the compiler too smart for that?) Also, there is no need to use the _RWSTD_SIZE_T macro in .cpp files. The macro is useful in library and test suite headers to reduce namespace pollution (so we don't have to #include <stddef.h>. Last thing: the code formatting convention calls for a space before each open parenthesis. It might take some getting used to but once you do, you'll never go back -- just ask Travis ;-) Martin
----- $ svn diff Index: tests/src/new.cpp =================================================================== --- tests/src/new.cpp (revision 644444) +++ tests/src/new.cpp (working copy) @@ -604,6 +604,17 @@ return ret; } +static void +rwt_checkpoint_compare (_RWSTD_SIZE_T* diffs, _RWSTD_SIZE_T n, + const _RWSTD_SIZE_T* st0, const _RWSTD_SIZE_T* st1, + bool& diff_0) +{ + for (_RWSTD_SIZE_T i = 0; i != n; ++i) { + diffs [i] = st1 [i] - st0 [i]; + if (diffs [i]) + diff_0 = false; + } +} _TEST_EXPORT rwt_free_store* rwt_checkpoint (const rwt_free_store *st0, const rwt_free_store *st1) @@ -616,21 +627,24 @@ // of the free_store specified by the arguments static rwt_free_store diff; - memset (&diff, 0, sizeof diff); - size_t* diffs = diff.new_calls_; - const size_t* st0_args = st0->new_calls_; - const size_t* st1_args = st1->new_calls_; - bool diff_0 = true; // difference of 0 (i.e., none) - for (size_t i = 0; i != 16; ++i) { - diffs [i] = st1_args [i] - st0_args [i]; - if (diffs [i]) - diff_0 = false; - } +#define EXTENT(array) (sizeof (array) / sizeof(*array)) +#define COMPARE(member) \ + rwt_checkpoint_compare (diff.member, EXTENT(diff.member),\ + st0->member, st1->member, diff_0) + COMPARE(new_calls_); + COMPARE(delete_calls_); + COMPARE(delete_0_calls_); + COMPARE(blocks_); + COMPARE(bytes_); + COMPARE(max_blocks_); + COMPARE(max_bytes_); + COMPARE(max_block_size_); + if (diff_0) return 0; ----- The 0.new test seems to be okay with it. Thanks, Brad.-----Original Message-----From: Travis Vitek (JIRA) [EMAIL PROTECTED] Sent: Thursday, April 03, 2008 3:23 PMTo: Eric LemingsSubject: [jira] Commented: (STDCXX-761) [HP aCC 6.16] Out of bound access in new.cpp[ https://issues.apache.org/jira/browse/STDCXX-761?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12585290#action_12585290 ]Travis Vitek commented on STDCXX-761: -------------------------------------It looks like someone is being tricky. They are assuming that every member in {{rwt_free_store}} is contiguous [i.e. no padding], and they are actually comparing each of {{new_calls_}}, {{delete_calls_}}, {{blocks_}}, {{bytes_}}, {{max_blocks_}}, {{max_bytes_}} and {{max_block_size_}} with that one loop. If you decide to fix this, you'll end up probably end up writing eight loops of two iterations each.Also, I'd prefer that the 2 isn't hardcoded and that you use something like {{sizeof (array) / sizeof (*array)}}, or a size macro instead.[HP aCC 6.16] Out of bound access in new.cpp -------------------------------------------- Key: STDCXX-761URL:https://issues.apache.org/jira/browse/STDCXX-761source file [new.cpp|http://svn.apache.org/repos/asf/stdcxx/trunk/tests/srProject: C++ Standard Library Issue Type: Sub-task Components: Test Driver Affects Versions: 4.2.0 Environment: $ uname -sr && aCC -V HP-UX B.11.31 aCC: HP C/aC++ B3910B A.06.16 [Nov 26 2007] Reporter: Scott (Yu) Zhong Assignee: Eric Lemings Fix For: 4.2.1 Original Estimate: 2h Remaining Estimate: 2hWhen compiled with HP aCC 6.16 +w +O, the test driverc/new.cpp] produces the warnings below:{noformat}aCC -c -I$(TOPDIR)/include -I$(BUILDDIR)/include-I$(TOPDIR)/tests/include -AA +O2 +DD64 +w \+W392 +W655 +W684 +W818 +W819 +W849 +W2193 +W2236+W2261 +W2340 +W2401 +W2487 +W4227 \+W4229 +W4231 +W4235 +W4237 +W4249 +W4255 +W4272 +W4284+W4285 +W4286 +W4296 +W4297 +W3348 \rwt_checkpoint: warning #20206-D: Out of bound access (In expression "(unsigned long long*)(&diff)->new_calls_+i", (&diff)->new_calls_ (type: unsigned long long [2]) has byte range [0 .. 15], writing byte range [0 .. 127].)$(TOPDIR)/tests/src/new.cpp"$(TOPDIR)/tests/src/new.cpp", line 629, procedure{noformat}-- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.