gpt4 book ai didi

c++ - 字符串错误检查

转载 作者:可可西里 更新时间:2023-11-01 18:38:25 28 4
gpt4 key购买 nike

我在代码中使用了很多字符串函数,例如 strncpystrncatsprintf 等。我知道有更好的替代方案,但我被移交给了一个旧项目,其中使用了这些功能,所以我必须坚持使用它们以实现兼容性和一致性。我的主管对错误检查和健壮性非常挑剔,并坚持要求我在每次使用这些函数时检查是否存在缓冲区溢出违规。这在我的代码中创建了很多 if-else 语句,看起来不太漂亮。我的问题是,每次调用其中一个函数时是否真的有必要检查溢出?即使我知道缓冲区溢出不可能发生,例如使用 sprintf 函数将整数存储在字符串中时

sprintf(buf,"%d",someInteger);

我知道在 64 位系统上无符号整数的最大长度可以是 20 位。另一方面,buf 的长度超过 20 个字符。在这种情况下我还应该检查缓冲区溢出吗?

最佳答案

我认为要走的路是使用异常(exception)。当您必须将程序的正常控制流与错误检查分离时,异常非常有用。

您可以为每个字符串函数 创建一个包装器,在其中执行错误检查并在发生缓冲区溢出时抛出异常。

然后,在您的客户端代码中,您可以简单地在 try block 中调用包装器,然后在 catch block 中检查异常并返回错误代码。

示例代码(未测试):

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, 100, "%d", i2);
sprintf_wrapper(buf3, 100, "%d", i3);
}
catch( my_buffer_exception& )
{
return err_code;
}
}

关于c++ - 字符串错误检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32889299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com