@@ -751,15 +751,20 @@ String format( const char* fmt, ... )
751
751
{
752
752
va_list va;
753
753
va_start (va, fmt);
754
- int bsize = static_cast <int >(buf.size ()),
755
- len = vsnprintf ((char *)buf, bsize, fmt, va);
754
+ int bsize = static_cast <int >(buf.size ());
755
+ #if defined _MSC_VER && __cplusplus < 201103L
756
+ int len = _vsnprintf_s ((char *)buf, bsize, _TRUNCATE, fmt, va);
757
+ #else
758
+ int len = vsnprintf ((char *)buf, bsize, fmt, va);
759
+ #endif
756
760
va_end (va);
757
761
758
762
if (len < 0 || len >= bsize)
759
763
{
760
764
buf.resize (std::max (bsize << 1 , len + 1 ));
761
765
continue ;
762
766
}
767
+ buf[bsize - 1 ] = 0 ;
763
768
return String ((char *)buf, len);
764
769
}
765
770
}
@@ -851,6 +856,22 @@ bool setBreakOnError(bool value)
851
856
return prevVal;
852
857
}
853
858
859
+ static bool cv_snprintf (char * buf, int len, const char * fmt, ...)
860
+ {
861
+ va_list va;
862
+ va_start (va, fmt);
863
+ #if defined _MSC_VER && __cplusplus < 201103L
864
+ int res = _vsnprintf_s ((char *)buf, len - 1 , _TRUNCATE, fmt, va);
865
+ va_end (va);
866
+ buf[len - 1 ] = 0 ;
867
+ return res >= 0 && res < len - 1 ;
868
+ #else
869
+ int res = vsnprintf ((char *)buf, len, fmt, va);
870
+ va_end (va);
871
+ return res >= 0 && res < len;
872
+ #endif
873
+ }
874
+
854
875
void error ( const Exception& exc )
855
876
{
856
877
if (customErrorCallback != 0 )
@@ -861,10 +882,10 @@ void error( const Exception& exc )
861
882
const char * errorStr = cvErrorStr (exc.code );
862
883
char buf[1 << 12 ];
863
884
864
- snprintf ( buf, sizeof (buf),
865
- " OpenCV Error: %s (%s) in %s, file %s, line %d" ,
885
+ cv_snprintf ( buf, sizeof (buf),
886
+ " OpenCV Error: %s (%s) in %s, file %s, line %d" ,
866
887
errorStr, exc.err .c_str (), exc.func .size () > 0 ?
867
- exc.func .c_str () : " unknown function" , exc.file .c_str (), exc.line );
888
+ exc.func .c_str () : " unknown function" , exc.file .c_str (), exc.line );
868
889
fprintf ( stderr, " %s\n " , buf );
869
890
fflush ( stderr );
870
891
# ifdef __ANDROID__
@@ -886,6 +907,7 @@ void error(int _code, const String& _err, const char* _func, const char* _file,
886
907
error (cv::Exception (_code, _err, _func, _file, _line));
887
908
}
888
909
910
+
889
911
ErrorCallback
890
912
redirectError ( ErrorCallback errCallback, void * userdata, void ** prevUserdata)
891
913
{
0 commit comments