From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-language; bh=bYPbbSE+w1eqhNbmRDbEWy5MLg4yAtAFrix43wY66hY=; b=k0kVtiS6jEpqZAGc0pw9hNjodGe0yuArNwzdiEsgAC4pYny+mY4f2DwyJQfkQ9veCv BubzySbDWxSqcu8Tdzy1EC7Yes2c5NW0klaXJ3H1vBraQ5X+iPrCFP87l8L6A9Qi3QJ/ mziYGADa30u+Bq4t1fPBuqdyHdONMUCdz56URYOmRwz9gwIbcP41Rz9Dv/Ji09oWVWPe ib0r6Rca29jAM7PYesbVGTHMC8EJ3ONZLBFt2Ddnd5sgCnVowt1u/9B6DgE1sm3p0rf/ MrzDND0v40UGuh2oILOGq9rkpleh37FgRXRc6dMXZkOHvu+D1QhBI7nC/cIX/Qg3psz8 u3VA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=bYPbbSE+w1eqhNbmRDbEWy5MLg4yAtAFrix43wY66hY=; b=FSAHPLl3zO3t+2KEgjTc4NcTryxnKcq9A13eVbypjk5hmorBoj4dnJTUmwSdvu8c6Z lLQiTTlVb4jQJY5I7LOA/ZL3lPPcZuRHTdW/jZkGCIFQtvxh08twNb/zaT5H3AQLOvuO lD4I8n2Jax8mchRa8ct/vjYGNhH91dgiRSgmpI71p3/ybh8AuXMN3AEiCy0vwVNU9GcW lcJ3Z4mDUoyCx9vCnz6FjGQzEtwF3rUdFqI08T2wH4qNlppIYltpUbapOwcRF19C5Gie aSX9grCVTQj+r/tO5bhmGUuSNwSfB+4cgtK/mJQZCX27hOwaO6NVN7DSHCdBPFjeyx1L R33w== X-Gm-Message-State: AHQUAuZac0rF6MG9DXhQ3rIfAnaUogex7zy4RT+rlwbfEUsd13ghMfG6 YeT0lyrm+ruRt+Io9pF6qNEPc7g5 X-Google-Smtp-Source: AHgI3IZypAGAO2rbavjc1Tm72ITgMpZPow2MxkUcOzcNc9XHTWLMrIFr4K9aOejAr81VMYHCs8Hhvw== X-Received: by 2002:a19:294d:: with SMTP id p74mr1068293lfp.101.1550925010370; Sat, 23 Feb 2019 04:30:10 -0800 (PST) To: devel@lists.altlinux.org References: <5d1faa4c-f21b-047b-b8e9-27d28109f0b0@altlinux.org> <20190221132501.GQ10173@altlinux.org> <42f17a50-affe-4c54-99ad-88502a65854f@gmail.com> <0116bbf4-9a04-9ff3-819f-729b785a3bb1@gmail.com> <20190223012117.79c39033@sem-notebook> From: Leonid Krivoshein Message-ID: <8caf2604-0d15-08c4-5e1a-672fad601818@gmail.com> Date: Sat, 23 Feb 2019 15:28:44 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: <20190223012117.79c39033@sem-notebook> Content-Type: multipart/mixed; boundary="------------BFCC8DDD33F255C9F6E29D6C" Content-Language: ru Subject: Re: [devel] =?utf-8?b?bWVtY3B5INCz0LvRjtGH0LjRgiAo0LjQu9C4INGPINC9?= =?utf-8?b?0LUg0YPQvNC10Y4g0LXQs9C+INCz0L7RgtC+0LLQuNGC0Ywp?= X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 23 Feb 2019 12:30:13 -0000 Archived-At: List-Archive: List-Post: This is a multi-part message in MIME format. --------------BFCC8DDD33F255C9F6E29D6C Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 23.02.2019 04:21, Mikhail Efremov пишет: > On Sat, 23 Feb 2019 01:48:30 +0300 Leonid Krivoshein wrote: >> 22.02.2019 23:51, Vladimir Didenko пишет: >>> пт, 22 февр. 2019 г. в 22:29, Leonid Krivoshein: >>>> Тут ко всему не очевидное поведение компилятора при работе с >>>> адресами, когда их складывают с целыми (много от чего зависит и в >>>> ряде случаев просто на ворнинги можно нарваться). Такой код в >>>> любом случае сразу переписывать на более безопасный, независимо от >>>> memcpy()/memmove(). Например, так: >>>> >>>> memmove(&_data.data[8], &data.data[9], _data.size - 9); /* если тип >>>> данных [unsigned] char */ >>>> >>> Вы глупость написали. Арифметика указателей и целых чисел вполне >>> определена и безопасна, если не выходить за границы массива. И еще - >>> запись p + 8 и &p[8] равносильны согласно стандарту языка C. > Более того, можно еще и &8[p] написать, совершенно корректная запись с > точки зрения синтаксиса языка :). Другое дело, что за такое в реальном > коде надо руки отрывать сразу. Согласен. Такого я не предлагал. >> И каково же её определение в разных стандартах языка C? А реализация >> в разных компиляторах? К примеру, согласно N1570 (6.5.6) над > В стандарте арифметика указателей описана вполне ясно. В актуальном, что я привёл? Или в каком-то другом? Раз возникают такие странные споры на почти пустом месте, значит, ясно не для всех одинаково. >> void-указателями такого не проделаешь, в отличие от gcc, который тоже >> ни один стандарт могёт. > Я не понял этой фразы и сравнения указателей с gcc. При чем тут > указатель на void? Размер объекта в этом случае не известен, разумеется > арифметика не работает. Моя фраза прозвучала вполне чётко: в этом месте gcc и действующий стандарт расходятся. gcc допускает сложение целого числа с указателем на void, принимая размер указываемого объекта равным одному байту. $ gcc -o v1 -DUSEVOID examle.c $ gcc -o v2 -DUSEVOID -DSAFEPTR examle.c examle.c: In function ‘main’: examle.c:21:12: warning: dereferencing ‘void *’ pointer   func(&base[6]);             ^ examle.c:21:7: warning: taking address of expression of type ‘void’   func(&base[6]);        ^ Пример во вложении. Теперь понятно, почему предлагаемая запись более безопасна? Вашу запись gcc проглотит, даже не поперхнувшись. В примере ещё и второе объяснение по объектам размером более одного байта: $ gcc -o i1 examle.c $ gcc -o i2 -DSAFEPTR examle.c ./i1 24 6 $ ./i2 24 6 Вы прибавляете к адресу целое число, которое является чем? Разницей в адресах или индексах? Я вот стандарты не штудирую, в голове их не держу, и в моей привычке такой записи никаких неоднозначных толкований быть не может. Просто пишите так, и не ошибётесь никогда. >> Кстати, именно с такой арифметикой на более >> старом gcc на ворнинги нарывался и всегда их сразу выправлял. Нет, >> лучше об этом не думать, а писать сразу так, чтобы работало везде. > Полагаю, что предупреждения были о чем-то другом. Может быть, не помню уже. Попробуйте откатить этот commit: http://git.altlinux.org/gears/p/propagator.git?p=propagator.git;a=commitdiff;h=d2866d5d21fd1fe31ebcbbf82490fbbb25de834b Более подходящего примера сходу не нахожу. -- Best regards, Leonid Krivoshein. --------------BFCC8DDD33F255C9F6E29D6C Content-Type: text/x-csrc; name="examle.c" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="examle.c" #include #if defined(USEVOID) #define TYPE void #else #define TYPE int #endif TYPE *base; void func(TYPE* ptr) { #if !defined(USEVOID) printf("%ld\n", ((void*)ptr) - ((void*)base)); #endif printf("%ld\n", ptr - base); } int main(int argc, char argv[]) { base = &argc; #if defined(SAFEPTR) func(&base[6]); #else func(base + 6); #endif return 0; } --------------BFCC8DDD33F255C9F6E29D6C--