Bug 48638 - NO_EFFECT необязательное сравнение с 0 в rpm-4.13.0.1/lib/header.c
Summary: NO_EFFECT необязательное сравнение с 0 в rpm-4.13.0.1/lib/header.c
Status: ASSIGNED
Alias: None
Product: Sisyphus
Classification: Development
Component: rpm (show other bugs)
Version: unstable
Hardware: x86 Linux
: P5 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-11-30 12:27 MSK by a.slepykh
Modified: 2026-04-27 13:19 MSK (History)
7 users (show)

See Also:


Attachments
Скриншот фрагмента кода (24.94 KB, image/png)
2023-11-30 12:27 MSK, a.slepykh
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description a.slepykh 2023-11-30 12:27:32 MSK
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.
Comment 1 Ivan Zakharyaschev 2026-04-27 13:19:01 MSK
Спасибо за сообщение!

Наверное, такое сообщение имеет смысл разобрать с точки зрения того, что там на самом деле авторы имели в виду и вдруг там ошибка.

Потому что с формальной точки зрения ничего плохого не происходит: ну истинно всегда и истинно. Компилятор должен же это превратить в ничто, если он знает, что там 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);