🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

9 total messages Started by Maciek Tue, 07 Dec 2021 19:24
przekręcenie licznika w zmiennej typu int - czy to UB ?
#310365
Author: Maciek
Date: Tue, 07 Dec 2021 19:24
4 lines
1753 bytes
Jeśli przez pomnożenie zmiennej wychodzi wartość która przekraczająca maksymalną wartość danego typu, to jest to już UB ? Czy jest to może jednak zdefiniowane gdzieś w standardzie ? Właściwie kompilatory z których korzystam dają mi zawsze wynik 0 w tym wypadku i pętla wykonuje się w nieskończoność.

Microsoft (R) C/C++ Optimizing Compiler Version 19.30.30705 for x64
gcc version 11.2.0
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310366
Author: Mateusz Viste
Date: Tue, 07 Dec 2021 20:31
18 lines
1468 bytes
2021-12-07 o 11:24 -0800, Maciek napisał:
> Jeśli przez pomnożenie zmiennej wychodzi wartość która przekraczająca
> maksymalną wartość danego typu, to jest to już UB ?

Poniżej zamieszczam kilka wycinków z ISO/IEC 9899 1990.

3.17.2: "An example of undefined behavior is the behavior on integer
overflow"

6.3.6: "As with any other arithmetic overflow, if the result does not
fit in the space provided the behavior is undefined"

Annex G.2 (Undefined behavior): "An arithmetic operation (...) produces
a result that cannot be represented in the space provided (such as
overflow or underflow)"


Mateusz
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310367
Author: Maciek
Date: Tue, 07 Dec 2021 20:35
20 lines
2184 bytes
wtorek, 7 grudnia 2021 o 21:31:45 UTC+1 Mateusz Viste napisał(a):
> 2021-12-07 o 11:24 -0800, Maciek napisał: 
> > Jeśli przez pomnożenie zmiennej wychodzi wartość która przekraczająca 
> > maksymalną wartość danego typu, to jest to już UB ?
> Poniżej zamieszczam kilka wycinków z ISO/IEC 9899 1990. 
> 
> 3.17.2: "An example of undefined behavior is the behavior on integer 
> overflow" 
> 
> 6.3.6: "As with any other arithmetic overflow, if the result does not 
> fit in the space provided the behavior is undefined" 
> 
> Annex G.2 (Undefined behavior): "An arithmetic operation (...) produces 
> a result that cannot be represented in the space provided (such as 
> overflow or underflow)" 
> 
> 
> Mateusz

Ok dzięki.
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310368
Author: Arnold Ziffel
Date: Wed, 12 Jan 2022 15:49
22 lines
2031 bytes
Mateusz Viste <mateusz@xyz.invalid> wrote:

> Drobna poprawka, żeby było śmieszniej.
> Rozdział 6.2.5.1 z tego samego dokumentu co wcześniej podaje:
> 
> "computation involving unsigned operands can never overflow because a
> result that cannot be represented by the resulting unsigned integer
> type is reduced modulo the number that is one greater than the largest
> value that can be represented by the resulting unsigned integer type"
> 
> Czyli przy typach *unsigned* UB nie występuje.

Chodzi, podejrzewam, o to, że sposób zapisu liczb ujemnych różni się 
między platformami. Nigdy w praktyce nie widziałem innego niż U2, ale 
istnieją, a C ma być przenośne.

-- 
Mówi lew do żaby:
- Ale ty jesteś brzydka... Jesteś zielona, oślizgła i masz strasznie
wyłupiaste oczy. W ogóle nie można na ciebie patrzeć!
Na to żaba (cichutko):
- Ja... Ja po prostu ostatnio dużo chorowałam...
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310369
Author: Tomasz Kaczanowski
Date: Wed, 12 Jan 2022 16:02
27 lines
2436 bytes
W dniu 12.01.2022 o 16:49, Arnold Ziffel pisze:
> Mateusz Viste <mateusz@xyz.invalid> wrote:
> 
>> Drobna poprawka, żeby było śmieszniej.
>> Rozdział 6.2.5.1 z tego samego dokumentu co wcześniej podaje:
>>
>> "computation involving unsigned operands can never overflow because a
>> result that cannot be represented by the resulting unsigned integer
>> type is reduced modulo the number that is one greater than the largest
>> value that can be represented by the resulting unsigned integer type"
>>
>> Czyli przy typach *unsigned* UB nie występuje.
> 
> Chodzi, podejrzewam, o to, że sposób zapisu liczb ujemnych różni się
> między platformami. Nigdy w praktyce nie widziałem innego niż U2, ale
> istnieją, a C ma być przenośne.
> 

ale czasem kompilator może robić optymalizacje wiedząc, że liczby takie 
nie mogą się "przekręcać" Jakiś czas temu był taki kod analizowany nawet 
chyba tu, a może na 4programmers - nie pamiętam, po włączeniu 
optymalizacji w nowszych kompilatorach kod działał właśnie dziwnie, bo 
kompilator robił dużą optymalizację biorąc pod uwagę, że nie może być 
przekręcenia.

-- 
http://zrzeda.pl
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310370
Author: Arnold Ziffel
Date: Mon, 17 Jan 2022 15:51
15 lines
1842 bytes
Tomasz Kaczanowski <kaczus@_wiadomo_.onet.pl> wrote:

> ale czasem kompilator może robić optymalizacje wiedząc, że liczby takie 
> nie mogą się "przekręcać"

To prawda. Tu ciekawy artykuł: 
https://research.checkpoint.com/2020/optout-compiler-undefined-behavior-optimizations/

-- 
Spotkali się Inteligent z AWF-u i Fizyczny z politechniki. Mieli w ramach
wspolzawodnictwa przejsc przez mur (na wprost). Fizyczny z politechniki
sierpowym przylozyl w mur i nic, mur stoi. Inteligent z AWF-u podszedl
i uderzeniem z glowki rozwalil mur i mowi do drugiego:
- Trzeba miec tu! (pokazujac na glowe), a nie tu! (uderzajac się
w biceps).
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310371
Author: Maciek
Date: Sat, 19 Mar 2022 23:00
17 lines
2608 bytes
poniedziałek, 17 stycznia 2022 o 16:52:01 UTC+1 Arnold Ziffel napisał(a):
> Tomasz Kaczanowski <kaczus@_wiadomo_.onet.pl> wrote: 
> 
> > ale czasem kompilator może robić optymalizacje wiedząc, że liczby takie 
> > nie mogą się "przekręcać"
> To prawda. Tu ciekawy artykuł: 
> https://research.checkpoint.com/2020/optout-compiler-undefined-behavior-optimizations/ 
> 
> -- 
> Spotkali się Inteligent z AWF-u i Fizyczny z politechniki. Mieli w ramach 
> wspolzawodnictwa przejsc przez mur (na wprost). Fizyczny z politechniki 
> sierpowym przylozyl w mur i nic, mur stoi. Inteligent z AWF-u podszedl 
> i uderzeniem z glowki rozwalil mur i mowi do drugiego: 
> - Trzeba miec tu! (pokazujac na glowe), a nie tu! (uderzajac się 
> w biceps).

W każdym bądź razie już widzę że może zachodzić taka sytuacja. Jak temu zapobiegać jeśli mam duże liczby i jest takie ryzyko ?
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310373
Author: Przemek Biernat
Date: Thu, 06 Oct 2022 17:03
3 lines
1607 bytes
> Jeśli przez pomnożenie zmiennej wychodzi wartość która przekraczająca maksymalną wartość danego typu, to jest to już UB ? Czy jest to może jednak zdefiniowane gdzieś w standardzie ? Właściwie kompilatory z których korzystam dają mi zawsze wynik 0 w tym wypadku i pętla wykonuje się w nieskończoność. 

Może trzeba zrobić modulo.
Re: przekręcenie licznika w zmiennej typu int - czy to UB ?
#310372
Author: Przemek Biernat
Date: Thu, 06 Oct 2022 17:04
4 lines
1997 bytes
> W każdym bądź razie już widzę że może zachodzić taka sytuacja. Jak temu zapobiegać jeśli mam duże liczby i jest takie ryzyko ?

Może trzeba zrobić modulo. Zależy od logiki.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads