Right shifting by negative count is not only undefined, but maps from one-to-many in clang [duplicate]Undefined, unspecified and implementation-defined behaviorHow do I detect unsigned integer multiply overflow?Why doesn't C have unsigned floats?Fastest sort of fixed length 6 int arrayLeft shifting with a negative shift countModulo arithmetic with signed integers undefined behavior in c?Why is f(i = -1, i = -1) undefined behavior?What is gcc doing under a bitwise complement, and a negative left shift count when constrained by integer size?gcc and clang produce different outputs while left-shifting with unsigned valuesIs there a rule to spot out UB?Are there any 2-complement platform/compiler, where signed shift doesn't do the usual thing?
Python: next in for loop
Mathematical cryptic clues
Are the number of citations and number of published articles the most important criteria for a tenure promotion?
What do you call a Matrix-like slowdown and camera movement effect?
How can I make my BBEG immortal short of making them a Lich or Vampire?
Problem of parity - Can we draw a closed path made up of 20 line segments...
Can I ask the recruiters in my resume to put the reason why I am rejected?
Can I make popcorn with any corn?
Why doesn't H₄O²⁺ exist?
What are the differences between the usage of 'it' and 'they'?
Dragon forelimb placement
Test if tikzmark exists on same page
Show that if two triangles built on parallel lines, with equal bases have the same perimeter only if they are congruent.
Is it important to consider tone, melody, and musical form while writing a song?
How do we improve the relationship with a client software team that performs poorly and is becoming less collaborative?
Why did Neo believe he could trust the machine when he asked for peace?
tikz: show 0 at the axis origin
Today is the Center
What would happen to a modern skyscraper if it rains micro blackholes?
Is it legal for company to use my work email to pretend I still work there?
How do I create uniquely male characters?
Minkowski space
What do the dots in this tr command do: tr .............A-Z A-ZA-Z <<< "JVPQBOV" (with 13 dots)
Is it unprofessional to ask if a job posting on GlassDoor is real?
Right shifting by negative count is not only undefined, but maps from one-to-many in clang [duplicate]
Undefined, unspecified and implementation-defined behaviorHow do I detect unsigned integer multiply overflow?Why doesn't C have unsigned floats?Fastest sort of fixed length 6 int arrayLeft shifting with a negative shift countModulo arithmetic with signed integers undefined behavior in c?Why is f(i = -1, i = -1) undefined behavior?What is gcc doing under a bitwise complement, and a negative left shift count when constrained by integer size?gcc and clang produce different outputs while left-shifting with unsigned valuesIs there a rule to spot out UB?Are there any 2-complement platform/compiler, where signed shift doesn't do the usual thing?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
This question already has an answer here:
Undefined, unspecified and implementation-defined behavior
9 answers
When I compile this C code and run it a dozen times on my machine, I get a different 9 digit negative number each time. Another clang compiler on another machine yields 10 digit positive integers that are different. I am expecting a strange value because right shifting by a negative count is undefined, but I am surprised that the value is not a single, unique number. Instead, I am get multiple values with the same input. Why is this not a mathematical function?
#include <stdio.h>
int main(void)
printf("%d", 1 >> -1);
return 0;
c one-to-many undefined-behavior
marked as duplicate by trentcl, Jonathan Leffler
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
Mar 8 at 4:26
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
Undefined, unspecified and implementation-defined behavior
9 answers
When I compile this C code and run it a dozen times on my machine, I get a different 9 digit negative number each time. Another clang compiler on another machine yields 10 digit positive integers that are different. I am expecting a strange value because right shifting by a negative count is undefined, but I am surprised that the value is not a single, unique number. Instead, I am get multiple values with the same input. Why is this not a mathematical function?
#include <stdio.h>
int main(void)
printf("%d", 1 >> -1);
return 0;
c one-to-many undefined-behavior
marked as duplicate by trentcl, Jonathan Leffler
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
Mar 8 at 4:26
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
Undefined, unspecified and implementation-defined behavior
9 answers
When I compile this C code and run it a dozen times on my machine, I get a different 9 digit negative number each time. Another clang compiler on another machine yields 10 digit positive integers that are different. I am expecting a strange value because right shifting by a negative count is undefined, but I am surprised that the value is not a single, unique number. Instead, I am get multiple values with the same input. Why is this not a mathematical function?
#include <stdio.h>
int main(void)
printf("%d", 1 >> -1);
return 0;
c one-to-many undefined-behavior
This question already has an answer here:
Undefined, unspecified and implementation-defined behavior
9 answers
When I compile this C code and run it a dozen times on my machine, I get a different 9 digit negative number each time. Another clang compiler on another machine yields 10 digit positive integers that are different. I am expecting a strange value because right shifting by a negative count is undefined, but I am surprised that the value is not a single, unique number. Instead, I am get multiple values with the same input. Why is this not a mathematical function?
#include <stdio.h>
int main(void)
printf("%d", 1 >> -1);
return 0;
This question already has an answer here:
Undefined, unspecified and implementation-defined behavior
9 answers
c one-to-many undefined-behavior
c one-to-many undefined-behavior
asked Mar 8 at 4:04
EugeneEugene
292
292
marked as duplicate by trentcl, Jonathan Leffler
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
Mar 8 at 4:26
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by trentcl, Jonathan Leffler
StackExchange.ready(function()
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function()
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function()
$hover.showInfoMessage('',
messageElement: $msg.clone().show(),
transient: false,
position: my: 'bottom left', at: 'top center', offsetTop: -7 ,
dismissable: false,
relativeToBody: true
);
,
function()
StackExchange.helpers.removeMessages();
);
);
);
Mar 8 at 4:26
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
Because the behavior is not defined, the compiler (in a case of Clang, at least, see below) chooses not to put anything in the register where the argument would be passed to printf
. This results in the register having whatever value was left there by the start-up code that prepares the C environment and calls main
. This happens to be some address used during start-up, and it is randomized by the Address Space Layout Randomization used to impede attacks on software.
Examination of the assembly generated by clang confirms no value is placed in the register, %esi, that would be used for this argument (using Apple LLVM 10.0.0 with clang-1000.11.45.5, building for its default target in macOS 10.14.3 with only the switch -O3
).
Other compilers may behave differently, of course, since the behavior is not defined by the C standard; this merely explains the observations reported by the OP in limited cases.
1
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
1
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
add a comment |
When you invoke undefined behavior, the compiler is allowed to do absolutely anything it wants. It's allowed to segfault, or print zero every time, or set your CPU on fire. Nothing really requires it to be deterministic or give the same result every time.
In this case, Clang knows that undefined behavior happens, so it just stops caring. It doesn't bother to compile a right-shift instruction—because nothing obligates it to. It doesn't even bother to put any value in the register, and leaves whatever value happened to be in there beforehand, which is unpredictable and effectively random.
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
Because the behavior is not defined, the compiler (in a case of Clang, at least, see below) chooses not to put anything in the register where the argument would be passed to printf
. This results in the register having whatever value was left there by the start-up code that prepares the C environment and calls main
. This happens to be some address used during start-up, and it is randomized by the Address Space Layout Randomization used to impede attacks on software.
Examination of the assembly generated by clang confirms no value is placed in the register, %esi, that would be used for this argument (using Apple LLVM 10.0.0 with clang-1000.11.45.5, building for its default target in macOS 10.14.3 with only the switch -O3
).
Other compilers may behave differently, of course, since the behavior is not defined by the C standard; this merely explains the observations reported by the OP in limited cases.
1
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
1
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
add a comment |
Because the behavior is not defined, the compiler (in a case of Clang, at least, see below) chooses not to put anything in the register where the argument would be passed to printf
. This results in the register having whatever value was left there by the start-up code that prepares the C environment and calls main
. This happens to be some address used during start-up, and it is randomized by the Address Space Layout Randomization used to impede attacks on software.
Examination of the assembly generated by clang confirms no value is placed in the register, %esi, that would be used for this argument (using Apple LLVM 10.0.0 with clang-1000.11.45.5, building for its default target in macOS 10.14.3 with only the switch -O3
).
Other compilers may behave differently, of course, since the behavior is not defined by the C standard; this merely explains the observations reported by the OP in limited cases.
1
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
1
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
add a comment |
Because the behavior is not defined, the compiler (in a case of Clang, at least, see below) chooses not to put anything in the register where the argument would be passed to printf
. This results in the register having whatever value was left there by the start-up code that prepares the C environment and calls main
. This happens to be some address used during start-up, and it is randomized by the Address Space Layout Randomization used to impede attacks on software.
Examination of the assembly generated by clang confirms no value is placed in the register, %esi, that would be used for this argument (using Apple LLVM 10.0.0 with clang-1000.11.45.5, building for its default target in macOS 10.14.3 with only the switch -O3
).
Other compilers may behave differently, of course, since the behavior is not defined by the C standard; this merely explains the observations reported by the OP in limited cases.
Because the behavior is not defined, the compiler (in a case of Clang, at least, see below) chooses not to put anything in the register where the argument would be passed to printf
. This results in the register having whatever value was left there by the start-up code that prepares the C environment and calls main
. This happens to be some address used during start-up, and it is randomized by the Address Space Layout Randomization used to impede attacks on software.
Examination of the assembly generated by clang confirms no value is placed in the register, %esi, that would be used for this argument (using Apple LLVM 10.0.0 with clang-1000.11.45.5, building for its default target in macOS 10.14.3 with only the switch -O3
).
Other compilers may behave differently, of course, since the behavior is not defined by the C standard; this merely explains the observations reported by the OP in limited cases.
edited Mar 8 at 4:18
answered Mar 8 at 4:12
Eric PostpischilEric Postpischil
80.3k890169
80.3k890169
1
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
1
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
add a comment |
1
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
1
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
1
1
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
Argh, finished examining the assembly output and came back to find your answer had gotten in first! +1 regardless, as this is entirely right.
– Draconis
Mar 8 at 4:20
1
1
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
@Draconis Ill thumbs up you bro, hate when that happens to me, also thumbed Eric.
– Bwebb
Mar 8 at 4:21
add a comment |
When you invoke undefined behavior, the compiler is allowed to do absolutely anything it wants. It's allowed to segfault, or print zero every time, or set your CPU on fire. Nothing really requires it to be deterministic or give the same result every time.
In this case, Clang knows that undefined behavior happens, so it just stops caring. It doesn't bother to compile a right-shift instruction—because nothing obligates it to. It doesn't even bother to put any value in the register, and leaves whatever value happened to be in there beforehand, which is unpredictable and effectively random.
add a comment |
When you invoke undefined behavior, the compiler is allowed to do absolutely anything it wants. It's allowed to segfault, or print zero every time, or set your CPU on fire. Nothing really requires it to be deterministic or give the same result every time.
In this case, Clang knows that undefined behavior happens, so it just stops caring. It doesn't bother to compile a right-shift instruction—because nothing obligates it to. It doesn't even bother to put any value in the register, and leaves whatever value happened to be in there beforehand, which is unpredictable and effectively random.
add a comment |
When you invoke undefined behavior, the compiler is allowed to do absolutely anything it wants. It's allowed to segfault, or print zero every time, or set your CPU on fire. Nothing really requires it to be deterministic or give the same result every time.
In this case, Clang knows that undefined behavior happens, so it just stops caring. It doesn't bother to compile a right-shift instruction—because nothing obligates it to. It doesn't even bother to put any value in the register, and leaves whatever value happened to be in there beforehand, which is unpredictable and effectively random.
When you invoke undefined behavior, the compiler is allowed to do absolutely anything it wants. It's allowed to segfault, or print zero every time, or set your CPU on fire. Nothing really requires it to be deterministic or give the same result every time.
In this case, Clang knows that undefined behavior happens, so it just stops caring. It doesn't bother to compile a right-shift instruction—because nothing obligates it to. It doesn't even bother to put any value in the register, and leaves whatever value happened to be in there beforehand, which is unpredictable and effectively random.
answered Mar 8 at 4:19
DraconisDraconis
1,6391019
1,6391019
add a comment |
add a comment |