gpt4 book ai didi

c - memset_s() : What does the standard mean with this piece of text?

转载 作者:太空狗 更新时间:2023-10-29 16:41:13 24 4
gpt4 key购买 nike

在 C11 中,K.3.7.4.1 memset_s 函数,我发现这段相当困惑的文字:

Unlike memset, any call to the memset_s function shall be evaluated strictly according to the rules of the abstract machine as described in (5.1.2.3). That is, any call to the memset_s function shall assume that the memory indicated by s and n may be accessible in the future and thus must contain the values indicated by c.

这意味着 memset 不是(必然)“严格按照抽象机的规则求值”。 (引用的章节是 5.1.2.3 程序执行。)

我无法理解标准为 memset 提供的余地,这里明确排除了 memset_s 的余地,以及这对两者的实现者意味着什么功能。

最佳答案

假设您已经读取了一个密码:

{
char password[128];

if (fgets(password, sizeof(password), stdin) != 0)
{
password[strcspn(password), "\n\r"]) = '\0';
validate_password(password);
memset(password, '\0', sizeof(password));
}
}

您已经仔细地设置了密码,因此不会被意外找到。

不幸的是,编译器被允许忽略 memset() 调用,因为 password 不再使用。 memset_s() 的规则表示调用不能省略; password 变量必须置零,无论优化如何。

memset_s(password, sizeof(password), '\0', sizeof(password));

这是 Annex K 中为数不多的真正有用的功能之一。 . (我们可以讨论必须重复大小的优点。但是,在更一般的情况下,第二个大小可以是变量,而不是常量,然后第一个大小成为防止变量失控的运行时保护。 )

请注意,此要求是针对编译器而不是库。 memset_s() 函数在调用时会正确运行,正如 memset() 在调用 时会正确运行一样。正在讨论的规则规定编译器必须调用memset_s(),即使它可以忽略对memset()的调用,因为变量不再使用。

关于c - memset_s() : What does the standard mean with this piece of text?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565539/

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