sprintf_s 导致崩溃

发布于 2024-11-28 07:54:05 字数 530 浏览 1 评论 0原文

我遇到问题了。 示例:

try
{
    char strMes[6];
    sprintf_s(strMes, sizeof(strMes), "%s", "012345678");
    printf(strMes);
}
catch(...)
{
    printf("Wrong\n");
}

在调试环境中,它导致调试器出现“缓冲区太小”消息。

在发布环境中它导致崩溃。

我尝试将 try-catch 块替换为 __try-__ except(EXCEPTION_EXECUTE_HANDLER) 块,但我得到了相同的行为。

我对 sprintf_s 函数有大约 1K 次调用,因此将 sprintf_s 替换为 _snprintf_s 对我来说不是一个选择。 (请参阅缓冲区太小的sprintf_s

请帮忙!

I meet problem.
Example:

try
{
    char strMes[6];
    sprintf_s(strMes, sizeof(strMes), "%s", "012345678");
    printf(strMes);
}
catch(...)
{
    printf("Wrong\n");
}

In debug environment it caused for debugger "buffer too small" message.

In release environment it caused for crash.

I tried to replace try-catch block to __try-__except(EXCEPTION_EXECUTE_HANDLER) block, but I get the same behavior.

I have about 1K callings for sprintf_s function, so replace sprintf_s to _snprintf_s is not option for me. (see sprintf_s with a buffer too small)

Please help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清音悠歌 2024-12-05 07:54:05

首先,我相信您应该使用snprintf而不是sprintf_s

其次,CRT 有一个 无效参数处理程序叫。尝试设置一下。

First of all, I believe you should use snprintf instead of sprintf_s.

Second, there is an invalid paramater handler for CRT that gets called. Try setting that.

梦纸 2024-12-05 07:54:05

在进一步使用 strMes 之前,您必须检查 sprintf_s 的返回值。否则你怎么知道缓冲区是否足够大?
sprintft_s 可能没有向 strMes 写入任何内容,因此它仍未初始化。这就是导致崩溃的原因(尝试删除 sprintf_s,它也可能崩溃。)

来自 sprintf_s 文档:

写入的字符数,如果发生错误则为 –1。如果
buffer 或 format 为空指针,sprintf_s 和 swprintf_s 返回 -1
并将 errno 设置为 EINVAL。

PS:由于 try/catch,您应该将这个问题标记为 C++ 而不是 C。

You must check the return value of sprintf_s before using strMes any further. Otherwise how do you know whether the buffer was big enough?
sprinft_s may have nothing written to strMes and so it is still uninitialized. That's what's causing the crash (try removing the sprintf_s, it likely crashes as well.)

From the sprintf_s docs:

The number of characters written, or –1 if an error occurred. If
buffer or format is a null pointer, sprintf_s and swprintf_s return -1
and set errno to EINVAL.

PS: You should tag this question C++ not C due to try/catch.

昵称有卵用 2024-12-05 07:54:05

阅读文档

...如果任一检查失败,则调用无效参数处理程序,如下所示
参数验证中描述...

默认行为是抛出。您可以覆盖它。

Read the documentation:

.... If either check fails, the invalid parameter handler is invoked, as
described in Parameter Validation ...

The default behaviour is throwing. You can override it.

记忆で 2024-12-05 07:54:05

如果您的 VS 版本支持,您应该对其运行代码分析。

了解关于代码分析

If your VS version supports, you should run Code Analysis on it.

Read about About Code Analysis

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文