我在我的代码中使用了很多字符串函数,如strncpy,strncat,sprintf等.我知道有更好的替代方案,但我被移交了一个旧项目,使用了这些功能,因此我必须坚持使用它们以实现兼容性和一致性.我的主管非常挑剔错误检查和健壮性,并坚持每次使用这些功能时都会检查缓冲区溢出违规.这在我的代码中创建了很多if-else语句,看起来不太漂亮.我的问题是,每次调用其中一个函数时,是否真的有必要检查溢出?即使我知道不可能发生缓冲区溢出,例如使用sprintf函数在字符串中存储整数时
的sprintf(buf中,“%d”,someInteger);
我知道64位系统上无符号整数的最大长度可以是20位.另一方面,buf超过20个字符.在这种情况下我还应该检查缓冲区溢出吗?
解决方法
我认为要走的路是使用异常.当您必须解耦程序的正常控制流和错误检查时,异常非常有用.
您可以做的是为每个字符串函数创建一个包装器,在该函数中执行错误检查并在发生缓冲区溢出时抛出异常.
然后,在您的客户端代码中,您可以简单地在try块中调用包装器,然后检查异常并在catch块内返回错误代码.
示例代码(未测试):
int sprintf_wrapper( char *buffer,int buffer_size,const char *format,... ) { if( /* check for buffer overflow */ ) throw my_buffer_exception; va_list arg_ptr; va_start( arg_ptr,format ); int ret = sprintf( buffer,format,arg_ptr ); va_end(arg_ptr); return ret; } Error foo() { //... try{ sprintf_wrapper(buf1,100,"%d",i1); sprintf_wrapper(buf2,i2); sprintf_wrapper(buf3,i3); } catch( my_buffer_exception& ) { return err_code; } }