Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 双倍值的最大长度?_C++_Mfc - Fatal编程技术网

C++ 双倍值的最大长度?

C++ 双倍值的最大长度?,c++,mfc,C++,Mfc,我收到hp fortify的缓冲区溢出:格式字符串警告。 你能告诉我一个双倍值的最大长度吗? 在以下示例中,dCode是存储在pszPref中的双精度值 代码: 我只想确认dCode的最大长度可以有十进制值,也可以没有十进制值。由于基数10通常不是浮点的最自然表示形式,因此没有最大字符串长度:要显示精确的浮点数,可能需要无限个基数10位 幸运的是,对于IEEE754浮点双精度计数器,15个有效数字就足够了。如果你写了一个双精度浮点数,然后再读回,那么你将得到与你开始时相同的数字。(使用 %.15

我收到hp fortify的缓冲区溢出:格式字符串警告。 你能告诉我一个双倍值的最大长度吗? 在以下示例中,
dCode
是存储在
pszPref
中的双精度值

代码:


我只想确认dCode的最大长度可以有十进制值,也可以没有十进制值。

由于基数10通常不是浮点的最自然表示形式,因此没有最大字符串长度:要显示精确的浮点数,可能需要无限个基数10位

幸运的是,对于IEEE754浮点双精度计数器,15个有效数字就足够了。如果你写了一个双精度浮点数,然后再读回,那么你将得到与你开始时相同的数字。(使用<代码> %.15e”<代码>作为<代码> Prtff < /C> >格式化程序>)尽管C++标准不坚持“代码>双<代码>是该类型,但最常见的是,在MFC为目标的系统上,它可能是.< /P>
您可以通过检查
std::numeric\u limits::is\u iec559

来测试是否(几乎)确定,因为您没有给出格式的精确参数,
printf
,默认情况下它的相关项使用6位小数

iee 754双精度浮点的最小值为
-1.7976931348623157E+308

要以6位十进制数字的精度打印该数字,您需要一个字符作为符号,一个字符作为小数点,308位数字作为整数部分,6位十进制数字总共316个字符。不要忘记为空终止符分配额外的字符。因此,只有使用IEE 754时,317个字符的数组应该足够,这不是由C++标准保证的。
hp fortify可能不知道这一点,而且假设iee 754是不安全的,因此无论使用多大的阵列,您都可能无法摆脱警告。为确保不会发生溢出,请使用
snprintf
或允许传递缓冲区大小的类似工具。

虽然不能准确回答您的问题,但您可以使用

即:


注意:如果您被困在Visual Studio 2010上,则必须将dCode强制转换为。

无论目标缓冲区实际有多大,只要您使用无界CRT字符串输出方法(
sprintf
strcpy
strcat
等),Fortify都将生成该警告。近年来,微软已经生产了所有这些方法的“安全”版本,这些方法都有一个扩展名。e、 g.
\u stprintf\u s

这些方法比截断版本(
snprintf
etc)有所改进,因为它们调用if溢出。截断方法不会溢出缓冲区,但理论上,它们可以用来处理一些可能导致黑客攻击的错误的缓冲区内容,这些错误内容可以被黑客用作攻击向量。 因此,要保护您的代码并闭嘴,请执行以下操作:

  • 使用处理溢出错误的回调方法调用
    \u set\u无效的\u参数\u处理程序(
    stdlib.h

  • 使用
    \u stprintf\u s(pszPref,sizeof(pszPref)/sizeof(pszPref[0]),“%f”,dCode)


  • 因此,如果我们包含十进制值,它可以跨越64??是的。但别担心。15个有效数字就足够了。不过,你需要使用科学记数法。看这个答案中的修正。不,你永远不需要“以10位数为基数的无限数”。哦,是的,你需要。我可以召唤出一个浮点表示,它可以被C++所接受,它需要无限数量。但事实上,
    是iec559
    检查的,15s.f.完成了这项工作。为什么会投反对票?浮点的序列化很棘手。您可能会感兴趣。使用
    snprintf
    避免缓冲区溢出的任何可能性
    \u stprintf\u s
    期望缓冲区大小为字符数,而不是字节数。由于Windows使用UTF-16(并且项目通常定义了
    UNICODE
    ),所以您创建了您正试图解决的缓冲区溢出。相反,使用可以推断缓冲区大小的函数模板:
    \u stprintf\u s(pszPref,\u T(“%f”),dCode)
    TCHAR pszPref[64];
    _stprintf(pszPref, "%f", dCode);
    
    std::string strPref = std::to_string(dCode);