以下哪一项以符合标准的方式做了“正确的事”?你可以假设m
and n
属于类型int
(有符号整数)。主要问题是有符号整数溢出。
样本1。
size_t bytes = n * m;
if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
/* allocate “bytes” space */
}
样本2。
if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
size_t bytes = n * m;
/* allocate “bytes” space */
}
样本 3。
if (n > 0 && m > 0 && SIZE_MAX/n >= m) {
size_t bytes = (size_t)n * (size_t)m;
/* allocate “bytes” space */
}
我认为他们都错了,但原因却不尽相同。那么什么才是正确的呢?
这些片段摘自here http://randomascii.wordpress.com/2014/04/17/buggy-security-guidance-from-apple/.
编辑强调主要问题是有符号整数相乘,这可能导致未定义的行为(无符号则不会)。
我现在认为,只要整数、有符号整数、size_t 和 SIZE_MAX 具有“通常”值,或者至少它们符合相关标准,最后一个示例就可以正确工作。
1和2是错误的,因为n * m
可能会溢出。事实上,您继续将其分配给size_t
不会“逆转”溢出。
我认为3是正确的。 (演员阵容m
顺便说一句是多余的)。如果有人不同意,请发布示例值m
and n
and SIZE_MAX
这使得测试不正确!
我也看不出以下问题:
if ( m > 0 && n > 0 && (size_t)m * n / n == m )
size_t bytes = (size_t)m * n;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)