gpt4 book ai didi

c++ - 如何防止 strncpy_s 在调试版本中填充目标缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:56 31 4
gpt4 key购买 nike

我维护了相当多的遗留代码,这些代码仍然大量使用 strncpy。我现在已经开始将 strncpy 的用法替换为其安全的对应项 strncpy_s。我注意到 strncpy_s 正在用 -2 值填充目标缓冲区 - 但仅在调试版本中!在发布版本中不会发生填充。

例如:

char buffer[3];
// buffer becomes 00000000 00000000 00000000
memset(buffer, 0, sizeof(buffer));
// buffer becomes 01100001 00000000 11111110
// 97 ('a') 0 -2
strncpy_s(buffer, sizeof(buffer), "a", _TRUNCATE);
// i is -2
int i = buffer[2];

MSDN docs不要提及这种填充行为,在我的例子中,这确实是我不想要的,因为我的遗留代码依赖于缓冲区的归零部分保持归零并且在字符串复制期间不会被覆盖这一事实。

有什么方法可以防止 strncpy_s 在调试版本中填充目标字符串?

请注意,我已经使用 Visual Studio 2010 和 Visual Studio 2013 对此进行了测试。

最佳答案

strncpy_s 的定义是空终止符之外的元素取未指定的值。 strncpy 的定义是那些元素被设置为0。如果您不希望出现这种情况,请不要使用 strncpy_s

此外,在输入对于缓冲区来说太大的情况下,strncpy_s 具有与 strncpy 不同的行为。

strncpystrncpy_s 的有效用例很少。使用 strcpysnprintfmemcpy 几乎总是更好。我强烈倾向于使用这三个函数中最适合该任务的那个。

IMO,称其为“安全对应物”有点夸张。如果您向它们传递正确的参数,“非安全”版本实际上是完全安全的;如果您没有传递正确的参数,那么这两种变体都不安全。

如果您使用 strncpy 的代码实际上没有错误,并且您依赖零填充功能,则没有理由更改它。

关于c++ - 如何防止 strncpy_s 在调试版本中填充目标缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26016826/

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