VC++ 2008 : Run-Time Check Failure #1

589 views
Skip to first unread message

Nathan McDaniel

unread,
Mar 23, 2010, 11:47:07 AM3/23/10
to Protocol Buffers

I am getting the following run-time check failure in coded_stream.h at
the following function:

"
inline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32
value,
uint8*
target) {
#if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) && \
defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN
memcpy(target, &value, sizeof(value));
#else
target[0] = static_cast<uint8>(value); ////////////////////////
This is where the error hits.
target[1] = static_cast<uint8>(value >> 8);
target[2] = static_cast<uint8>(value >> 16);
target[3] = static_cast<uint8>(value >> 24);
#endif
return target + sizeof(value);
}
"


Visual Studio Error:
"
Run-Time Check Failure #1 - A cast to a smaller data type has caused a
loss of data. If this was intentional, you should mask the source of
the cast with the appropriate bitmask. For example:
char c = (i & 0xFF);
Changing the code in this way will not affect the quality of the
resulting optimized code.
"

Has anyone seen this? Did I do something wrong or is this something
that needs to change in the library? I think--but have not yet
verified--that I can disable this when compiling the protocol buffer
library.

Screenshot here:
http://www.postimage.org/image.php?v=gxpNWti

This post is similar to the problem I'm having:
http://stackoverflow.com/questions/161369/switch-off-run-time-check-in-visual-studio

Thank you,

Nathan

Nathan McDaniel

unread,
Mar 23, 2010, 12:24:18 PM3/23/10
to Protocol Buffers

Well I added this to common.h, which doesn't fix the problem but it
gets around it by enabling the little-endian-assumption optimizations
for windows:


<patch>
Index: common.h

===================================================================
--- common.h (revision 4984)
+++ common.h (working copy)
@@ -76,6 +76,13 @@
#define LIBPROTOC_EXPORT
#endif

+
+// __BYTE_ORDER is not defined on Windows, so set it here:
+#if defined(_MSC_VER) && !defined(__BYTE_ORDER) && defined(_M_IX86)
+ #define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+
namespace internal {

// Some of these constants are macros rather than const ints so that
they can

</patch>

Kenton Varda

unread,
Mar 23, 2010, 5:00:47 PM3/23/10
to Nathan McDaniel, Protocol Buffers
The loss of data is intentional.  I've never seen MSVC or any other compiler complain about this before.  Feel free to send a patch adding the bit masks it asks for.


--
You received this message because you are subscribed to the Google Groups "Protocol Buffers" group.
To post to this group, send email to prot...@googlegroups.com.
To unsubscribe from this group, send email to protobuf+u...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.


Nathan McDaniel

unread,
Mar 24, 2010, 2:38:15 PM3/24/10
to Kenton Varda, prot...@googlegroups.com
Hi Kenton,

The attached patch patches two files:
  - coded_stream.h: disables "cast to smaller types" runtime checks in that file, for Visual C++ >= 2003. This was the "least invasive" fix. I can change it if you prefer.
  - common.h: sets the __BYTE_ORDER to __LITTLE_ENDIAN for MSVC, which enables the "copy full byte" optimizations (e.g. in coded_stream.h line 744).


Nathan
vc2008_patch.patch

Kenton Varda

unread,
Apr 5, 2010, 7:21:51 PM4/5/10
to Nathan McDaniel, prot...@googlegroups.com
Revision 325 is equivalent to your patch, but I decided to arrange it a little differently.  Thanks!  Sorry for the long delay.

Reply all
Reply to author
Forward
0 new messages