在进行验证时,安全性至关重要的代码(应该在嵌入式设备中执行)被忽略了,但是我看到了GCC和Clang发出的一些警告。由于所涉及的代码来自开源BSD libc,因此警告很容易重现:
$ wget https://raw.githubusercontent.com/freebsd/\
freebsd/af3e10e5a78d3af8cef6088748978c6c612757f0/lib/libc/stdlib/qsort.c
$ gcc -c -Wall -Wsign-compare -DI_AM_QSORT_R -Wall qsort.c
qsort.c: In function 'qsort_r':
qsort.c:45:24: warning: comparison between signed and unsigned
integer expressions [-Wsign-compare]
#define MIN(a, b) ((a) < (b) ? a : b)
^
qsort.c:186:6: note: in expansion of macro 'MIN'
r = MIN(pd - pc, pn - pd - es);
^
qsort.c:45:34: warning: signed and unsigned type in conditional
expression [-Wsign-compare]
#define MIN(a, b) ((a) < (b) ? a : b)
^
qsort.c:186:6: note: in expansion of macro 'MIN'
r = MIN(pd - pc, pn - pd - es);
要了解这些警告(从GCC和CLang发出)...
pd
,pc
并且pn
是指针es
是size_t
(即unsigned
)可以说,C的处理有符号实体和无符号实体之间比较的规则可以适当地表达为“不要,因为上帝的爱” [1]。
但是在这种情况下,BSD实现qsort
比较...
ptrdiff_t
)的结果es
-,这是无符号的。为什么unsigned
从ptrdiff_t
1(即带符号的1)减去一个值会导致unsigned
1?您可以在上面引用的帖子中了解到这一点。可以说,对于单词大小的实体,signed OPERATOR unsigned
结果的任何表达式都为unsigned
类型。
因此,为了简而言之,为了让GCC和CLang停止抱怨,必须从...开始改变界限。
r = MIN(pd - pc, pn - pd - es);
可以:
r = MIN((unsigned)(pd - pc), pn - pd - es)
或者:
r = MIN(pd - pc, (signed)(pn - pd - es));
问题是...正确的补丁是什么?
[1] “为什么不在C / C ++中混合带符号和无符号的值?” ,http://blog.regehr.org/archives/268
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句