Thread View: pl.comp.lang.c
9 messages
9 total messages
Started by Maciek
Tue, 07 Dec 2021 19:24
przekręcenie licznika w zmiennej typu int - czy to UB ?
Author: Maciek
Date: Tue, 07 Dec 2021 19:24
Date: Tue, 07 Dec 2021 19:24
4 lines
1753 bytes
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 ?
Author: Mateusz Viste
Date: Tue, 07 Dec 2021 20:31
Date: Tue, 07 Dec 2021 20:31
18 lines
1468 bytes
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 ?
Author: Maciek
Date: Tue, 07 Dec 2021 20:35
Date: Tue, 07 Dec 2021 20:35
20 lines
2184 bytes
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 ?
Author: Arnold Ziffel
Date: Wed, 12 Jan 2022 15:49
Date: Wed, 12 Jan 2022 15:49
22 lines
2031 bytes
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 ?
Author: Tomasz Kaczanowski
Date: Wed, 12 Jan 2022 16:02
Date: Wed, 12 Jan 2022 16:02
27 lines
2436 bytes
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 ?
Author: Arnold Ziffel
Date: Mon, 17 Jan 2022 15:51
Date: Mon, 17 Jan 2022 15:51
15 lines
1842 bytes
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 ?
Author: Maciek
Date: Sat, 19 Mar 2022 23:00
Date: Sat, 19 Mar 2022 23:00
17 lines
2608 bytes
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 ?
Author: Przemek Biernat
Date: Thu, 06 Oct 2022 17:03
Date: Thu, 06 Oct 2022 17:03
3 lines
1607 bytes
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 ?
Author: Przemek Biernat
Date: Thu, 06 Oct 2022 17:04
Date: Thu, 06 Oct 2022 17:04
4 lines
1997 bytes
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