diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index 82430b5a21c08d1d2e476f5e4c0235f5f70cc184..101c1bbf9476aaba99902062f91814fcdbf5377f 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -114,9 +114,11 @@ char* floatToString( char* buf, float value, bool halfprecision, bool explicitZe } else { - static const char* fmt = halfprecision ? "%.4e" : "%.8e"; char* ptr = buf; - sprintf( buf, fmt, value ); + if (halfprecision) + sprintf(buf, "%.4e", value); + else + sprintf(buf, "%.8e", value); if( *ptr == '+' || *ptr == '-' ) ptr++; for( ; cv_isdigit(*ptr); ptr++ ) @@ -350,6 +352,7 @@ public: void init() { + flags = 0; buffer.clear(); bufofs = 0; state = UNDEFINED; @@ -358,6 +361,7 @@ public: write_mode = false; mem_mode = false; space = 0; + wrap_margin = 71; fmt = 0; file = 0; gzfile = 0; @@ -615,7 +619,8 @@ public: for(;;) { int line_offset = (int)ftell( file ); - char* ptr0 = gets( &xml_buf_[0], xml_buf_size ), *ptr; + const char* ptr0 = this->gets(&xml_buf_[0], xml_buf_size ); + const char* ptr = NULL; if( !ptr0 ) break; ptr = ptr0; @@ -708,7 +713,7 @@ public: const char* json_signature = "{"; const char* xml_signature = "gets( buf, sizeof(buf)-2 ); char* bufPtr = cv_skip_BOM(buf); size_t bufOffset = bufPtr - buf; @@ -861,7 +866,7 @@ public: char* gets() { - char* ptr = gets(bufferStart(), (int)(bufferEnd() - bufferStart())); + char* ptr = this->gets(bufferStart(), (int)(bufferEnd() - bufferStart())); if( !ptr ) { ptr = bufferStart(); // FIXIT Why do we need this hack? What is about other parsers JSON/YAML? @@ -1766,11 +1771,13 @@ public: }; FileStorage::FileStorage() + : state(0) { p = makePtr(this); } FileStorage::FileStorage(const String& filename, int flags, const String& encoding) + : state(0) { p = makePtr(this); bool ok = p->open(filename.c_str(), flags, encoding.c_str()); diff --git a/modules/core/src/persistence.hpp b/modules/core/src/persistence.hpp index 38ad08b4ac321cf606ce54f67e1634656bc38c84..05c7adc17ce3210d1798fc85d165cc45d07a6747 100644 --- a/modules/core/src/persistence.hpp +++ b/modules/core/src/persistence.hpp @@ -96,11 +96,20 @@ int decodeFormat( const char* dt, int* fmt_pairs, int max_len ); int decodeSimpleFormat( const char* dt ); } + +#ifdef CV_STATIC_ANALYSIS +#define CV_PARSE_ERROR_CPP(errmsg) do { (void)fs; abort(); } while (0) +#else #define CV_PARSE_ERROR_CPP( errmsg ) \ fs->parseError( CV_Func, (errmsg), __FILE__, __LINE__ ) +#endif + + +#define CV_PERSISTENCE_CHECK_END_OF_BUFFER_BUG_CPP() do { \ + CV_DbgAssert(ptr); \ + if((ptr)[0] == 0 && (ptr) == fs->bufferEnd() - 1) CV_PARSE_ERROR_CPP("OpenCV persistence doesn't support very long lines"); \ +} while (0) -#define CV_PERSISTENCE_CHECK_END_OF_BUFFER_BUG_CPP() \ - if((ptr)[0] == 0 && (ptr) == fs->bufferEnd() - 1) CV_PARSE_ERROR_CPP("OpenCV persistence doesn't support very long lines") class FileStorageParser; class FileStorageEmitter; @@ -151,6 +160,7 @@ public: virtual double strtod(char* ptr, char** endptr) = 0; virtual char* parseBase64(char* ptr, int indent, FileNode& collection) = 0; + CV_NORETURN virtual void parseError(const char* funcname, const std::string& msg, const char* filename, int lineno) = 0; };