sprintf_s导致崩溃

时间:2011-08-07 11:28:30

标签: c++ error-handling printf

我遇到了问题。 例如:

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

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

在发布环境中导致崩溃。

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

我有大约1K的sprintf_s函数调用,所以将sprintf_s替换为_snprintf_s不是我的选择。 (见sprintf_s with a buffer too small

请帮忙!

4 个答案:

答案 0 :(得分:5)

首先,我认为你应该使用snprintf代替sprintf_s

其次,CRT有invalid paramater handler被调用。尝试设置。

答案 1 :(得分:1)

必须检查sprintf_s的返回值,然后再使用strMes。否则你怎么知道缓冲区是否足够大? sprinft_s可能没有写入strMes,因此它仍然未初始化。这就是导致崩溃的原因(尝试删除sprintf_s,它也可能崩溃。)

来自sprintf_s文档:

  

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

PS:你应该用try / catch标记这个问题C ++而不是C.

答案 2 :(得分:1)

阅读documentation

  

....如果任一检查失败,则调用无效参数处理程序,如   在参数验证...

中描述

默认行为是抛出。你可以override

答案 3 :(得分:0)

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

了解About Code Analysis