From 73911f2e333c124662d82cf92155aefb76f8ccf0 Mon Sep 17 00:00:00 2001 From: Aaron Jacobs Date: Tue, 24 May 2011 00:41:12 +0000 Subject: [PATCH] Fixed a hard to debug crash on OS X related to sscanf format strings. See here for more info: http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html --- src/lib_json/json_reader.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/lib_json/json_reader.cpp b/src/lib_json/json_reader.cpp index 8bb0304..f3a5c41 100644 --- a/src/lib_json/json_reader.cpp +++ b/src/lib_json/json_reader.cpp @@ -610,17 +610,25 @@ Reader::decodeDouble( Token &token ) const int bufferSize = 32; int count; int length = int(token.end_ - token.start_); + + // Avoid using a string constant for the format control string given to + // sscanf, as this can cause hard to debug crashes on OS X. See here for more + // info: + // + // http://developer.apple.com/library/mac/#DOCUMENTATION/DeveloperTools/gcc-4.0.1/gcc/Incompatibilities.html + char format[] = "%lf"; + if ( length <= bufferSize ) { Char buffer[bufferSize+1]; memcpy( buffer, token.start_, length ); buffer[length] = 0; - count = sscanf( buffer, "%lf", &value ); + count = sscanf( buffer, format, &value ); } else { std::string buffer( token.start_, token.end_ ); - count = sscanf( buffer.c_str(), "%lf", &value ); + count = sscanf( buffer.c_str(), format, &value ); } if ( count != 1 )