| Summary: | NO_EFFECT необязательное сравнение с 0 в rpm-4.13.0.1/lib/header.c | ||||||
|---|---|---|---|---|---|---|---|
| Product: | Sisyphus | Reporter: | a.slepykh | ||||
| Component: | rpm | Assignee: | placeholder <placeholder> | ||||
| Status: | ASSIGNED --- | QA Contact: | qa-sisyphus | ||||
| Severity: | normal | ||||||
| Priority: | P5 | CC: | antohami, at, glebfm, imz, ldv, placeholder, vt | ||||
| Version: | unstable | ||||||
| Hardware: | x86 | ||||||
| OS: | Linux | ||||||
| Attachments: |
|
||||||
Спасибо за сообщение! Наверное, такое сообщение имеет смысл разобрать с точки зрения того, что там на самом деле авторы имели в виду и вдруг там ошибка. Потому что с формальной точки зрения ничего плохого не происходит: ну истинно всегда и истинно. Компилятор должен же это превратить в ничто, если он знает, что там unsigned, и наверно предупредить из тех же соображений (а вдруг человек имел в виду другое). Однако сейчас при компиляции header.c предупреждений нет: $ fgrep header.c rpm-answer-bug-alt-48312-compile.txt -A1 fgrep: warning: fgrep is obsolescent; using grep -F /bin/sh ../libtool --tag=CC --mode=compile x86_64-alt-linux-gcc -DHAVE_CONFIG_H -I.. -I.. -I../include/ -DLOCALEDIR="\"/usr/share/locale\"" -DRPMCONFIGDIR="\"/usr/lib/rpm\"" -DSYSCONFDIR="\"/etc\"" -DLOCALSTATEDIR="\"/var/lib\"" -DLIBRPMALIAS_FILENAME="\"rpmpopt-4.13.0.1\"" -DLIBRPMALIAS_EXECPATH="\"/usr/bin\"" -I/usr/include/beecrypt -DLUA_COMPAT_APIINTCASTS -pipe -frecord-gcc-switches -Wall -g -O2 -flto=auto -DLUA_COMPAT_APIINTCASTS -fPIC -DPIC -D_REENTRANT -Wall -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -fno-strict-aliasing -fstack-protector -Wempty-body -c -o header.lo header.c libtool: compile: x86_64-alt-linux-gcc -DHAVE_CONFIG_H -I.. -I.. -I../include/ -DLOCALEDIR=\"/usr/share/locale\" -DRPMCONFIGDIR=\"/usr/lib/rpm\" -DSYSCONFDIR=\"/etc\" -DLOCALSTATEDIR=\"/var/lib\" -DLIBRPMALIAS_FILENAME=\"rpmpopt-4.13.0.1\" -DLIBRPMALIAS_EXECPATH=\"/usr/bin\" -I/usr/include/beecrypt -DLUA_COMPAT_APIINTCASTS -pipe -frecord-gcc-switches -Wall -g -O2 -flto=auto -DLUA_COMPAT_APIINTCASTS -fPIC -DPIC -D_REENTRANT -Wall -Wpointer-arith -Wmissing-prototypes -Wstrict-prototypes -fno-strict-aliasing -fstack-protector -Wempty-body -c header.c -fPIC -DPIC -o .libs/header.o make[3]: Leaving directory '/usr/src/RPM/BUILD/rpm-4.13.0.1/lib' Код, вызвавший вопросы, на месте. man-страница говорит, что iconv возвращает size_t, т.е. действительно беззнаковый тип: iconv(3) -- 2023-07-20 -- Linux man-pages 6.05.01 NAME iconv - perform character set conversion LIBRARY Standard C library (libc, -lc) SYNOPSIS #include <iconv.h> size_t iconv(iconv_t cd, char **restrict inbuf, size_t *restrict inbytesleft, char **restrict outbuf, size_t *restrict outbytesleft); |
Created attachment 15132 [details] Скриншот фрагмента кода Необязательное сравнение с нулем в строке 1278 в условной конструкции if(iconv (icd, &inbuf, &inbufleft, &outbuf, &outbufleft) >= 0), поскольку функция iconv() возвращает беззнаковый тип, то есть результат всегда будет больше или равен нулю. Found by Linux Verification Center (portal.linuxtesting.ru) with SVACE. Author A.Slepykh.