c – 字符串错误检查

前端之家收集整理的这篇文章主要介绍了c – 字符串错误检查前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的代码中使用了很多字符串函数,如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;
    }
}

猜你在找的C&C++相关文章