首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这密码安全吗?

这密码安全吗?
EN

Stack Overflow用户
提问于 2014-01-22 11:21:00
回答 4查看 146关注 0票数 0
代码语言:javascript
复制
const std::string makeUniqueName()
{
    srand(time(NULL));
    std::string s;                                                                                                             
    std::generate_n(const_cast<char*>(s.c_str()), 10, RndGenerator()); 
    return s;
}

此代码是否安全:编译器不报告任何警告消息。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-22 11:28:27

代码显然通过写入尚未分配的内存来调用未定义的行为。要么用足够的空间构造这些字符(std::string s(10, 0);)的字符串,然后将std::begin(s)传递给generate_n,要么使用std::back_inserter

此外,通过在const_cast指针上使用const,您再次调用未定义的行为(从const对象中移除const,然后写入它是未定义的行为)。

另外:不要返回const值,它会抑制移动语义,而您不希望这样做。

票数 3
EN

Stack Overflow用户

发布于 2014-01-22 11:22:51

如果您想要写入字符串,则需要为它分配一些存储空间。

也许更重要的是,您必须停止在c_str()上使用c_str()。不允许修改c_str()指向的内存。目前,您的代码调用未定义的行为。

即使这样,您的代码也不一定会在每次调用时生成唯一的名称。您可以将它称为非常接近的两次,time(NULL)对这两个调用都返回相同的内容。或者您可能会发现,即使有不同的种子,RNG也会返回相同的值。

票数 2
EN

Stack Overflow用户

发布于 2014-01-22 11:24:41

不,不安全!

您的字符串中没有任何内容,您正在尝试向其中添加10项。您需要在字符串中保留如下空间:

代码语言:javascript
复制
std::string s(10,' ');

如果你要直接写信给它的话。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21281509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档