C's equality operator on converted pointers Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Casting integer constant to a pointer typeWhat are the differences between a pointer variable and a reference variable in C++?What is a smart pointer and when should I use one?How do function pointers in C work?What does the C ??!??! operator do?Why should I use a pointer rather than the object itself?How to determine if a pointer equals an element of an array?Comparing pointer values after conversion, still same equality?Equality comparison of pointers to different objectsCan an equality comparison of unrelated pointers evaluate to true?Identically-valued pointers comparing unequal
Has negative voting ever been officially implemented in elections, or seriously proposed, or even studied?
How to compare two different files line by line in unix?
Project Euler #1 in C++
Put R under double integral
How to write capital alpha?
Electrolysis of water: Which equations to use? (IB Chem)
Did any compiler fully use 80-bit floating point?
Is it possible to force a specific program to remain in memory after closing it?
What order were files/directories output in dir?
Is CEO the "profession" with the most psychopaths?
Significance of Cersei's obsession with elephants?
Putting class ranking in CV, but against dept guidelines
How to unroll a parameter pack from right to left
Interpretation of R output from Cohen's Kappa
How many time has Arya actually used Needle?
How were pictures turned from film to a big picture in a picture frame before digital scanning?
A term for a woman complaining about things/begging in a cute/childish way
Why does it sometimes sound good to play a grace note as a lead in to a note in a melody?
Central Vacuuming: Is it worth it, and how does it compare to normal vacuuming?
Do I really need to have a message in a novel to appeal to readers?
Random body shuffle every night—can we still function?
Is it fair for a professor to grade us on the possession of past papers?
Drawing spherical mirrors
What is an "asse" in Elizabethan English?
C's equality operator on converted pointers
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Casting integer constant to a pointer typeWhat are the differences between a pointer variable and a reference variable in C++?What is a smart pointer and when should I use one?How do function pointers in C work?What does the C ??!??! operator do?Why should I use a pointer rather than the object itself?How to determine if a pointer equals an element of an array?Comparing pointer values after conversion, still same equality?Equality comparison of pointers to different objectsCan an equality comparison of unrelated pointers evaluate to true?Identically-valued pointers comparing unequal
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
Coming from Casting integer constant to a pointer type
From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):
An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.
Then, from 6.5.9p6, we have:
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.
So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:
struct A;
int f(void)
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.
How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?
All major compilers return true for the above code, as one would expect.
c pointers language-lawyer
add a comment |
Coming from Casting integer constant to a pointer type
From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):
An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.
Then, from 6.5.9p6, we have:
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.
So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:
struct A;
int f(void)
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.
How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?
All major compilers return true for the above code, as one would expect.
c pointers language-lawyer
What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?
– Christian Gibbons
2 hours ago
They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with-O3. Strange...
– St.Antario
2 hours ago
2
@ChristianGibbons That refers to the null pointer constant case.
– Acorn
2 hours ago
add a comment |
Coming from Casting integer constant to a pointer type
From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):
An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.
Then, from 6.5.9p6, we have:
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.
So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:
struct A;
int f(void)
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.
How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?
All major compilers return true for the above code, as one would expect.
c pointers language-lawyer
Coming from Casting integer constant to a pointer type
From that question, we know from 6.3.2.3p5 (C11) that we can convert any integer into a pointer (i.e. it is not UB on itself):
An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.
Then, from 6.5.9p6, we have:
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function, both are pointers to one past the last element of the same array object, or one is a pointer to one past the end of one array object and the other is a pointer to the start of a different array object that happens to immediately follow the first array object in the address space.
So it seems we can apply the equality operator here with no UB (unlike the relational operators). Consider:
struct A;
int f(void)
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return a == b;
Assuming there is no A object in a's address 1, one could argue that f() should return false, because no condition matches the above.
How is this refuted? Does "pointer to the same object" refer to addresses, even if no objects are there (not like the compiler could know, anyway)? Should we simply understand that it is implementation-defined since the previous results were already implementation-defined? Where does the standard specify this?
All major compilers return true for the above code, as one would expect.
c pointers language-lawyer
c pointers language-lawyer
edited 2 hours ago
Acorn
asked 2 hours ago
AcornAcorn
6,70111441
6,70111441
What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?
– Christian Gibbons
2 hours ago
They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with-O3. Strange...
– St.Antario
2 hours ago
2
@ChristianGibbons That refers to the null pointer constant case.
– Acorn
2 hours ago
add a comment |
What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?
– Christian Gibbons
2 hours ago
They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with-O3. Strange...
– St.Antario
2 hours ago
2
@ChristianGibbons That refers to the null pointer constant case.
– Acorn
2 hours ago
What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?
– Christian Gibbons
2 hours ago
What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?
– Christian Gibbons
2 hours ago
They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with
-O3. Strange...– St.Antario
2 hours ago
They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with
-O3. Strange...– St.Antario
2 hours ago
2
2
@ChristianGibbons That refers to the null pointer constant case.
– Acorn
2 hours ago
@ChristianGibbons That refers to the null pointer constant case.
– Acorn
2 hours ago
add a comment |
5 Answers
5
active
oldest
votes
How is this refuted? Does "pointer to the same object" refer to
addresses, even if no objects are there
No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.
But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
Consider the Standard's definition of "object":
object
region of data storage in the execution environment, the contents of
which can represent values
(C 2011, 3.15/1)
Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.
(not like the compiler could
know, anyway)?
Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.
Should we simply understand that it is
implementation-defined since the previous results were already
implementation-defined?
Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.
Where does the standard specify this?
It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
add a comment |
Constraint violation
An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5
With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.
Next code tries to initialize a below.
struct A * a = (struct A *) 1;
Initialization constraints include:
No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2
It is not defined that (struct A *) 1 meets that constraint.
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole ofa. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this:struct int a; x = .b = 1;.
– John Bollinger
17 secs ago
add a comment |
This comparison between 2 pointers to arbitrary objects is implementation defined.
Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.
A detailed discussion is here. In this detailed explanation you can see a concrete example so:
Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first.
add a comment |
Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.
This however should be OK:
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return (int)a == (int)b;
Since you convert an integer to a pointer and back again to get the original value.
4
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
add a comment |
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function
Both a and b refer to the same (invalid) memory address i.e. 0x1
Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55764953%2fcs-equality-operator-on-converted-pointers%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
5 Answers
5
active
oldest
votes
5 Answers
5
active
oldest
votes
active
oldest
votes
active
oldest
votes
How is this refuted? Does "pointer to the same object" refer to
addresses, even if no objects are there
No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.
But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
Consider the Standard's definition of "object":
object
region of data storage in the execution environment, the contents of
which can represent values
(C 2011, 3.15/1)
Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.
(not like the compiler could
know, anyway)?
Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.
Should we simply understand that it is
implementation-defined since the previous results were already
implementation-defined?
Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.
Where does the standard specify this?
It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
add a comment |
How is this refuted? Does "pointer to the same object" refer to
addresses, even if no objects are there
No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.
But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
Consider the Standard's definition of "object":
object
region of data storage in the execution environment, the contents of
which can represent values
(C 2011, 3.15/1)
Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.
(not like the compiler could
know, anyway)?
Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.
Should we simply understand that it is
implementation-defined since the previous results were already
implementation-defined?
Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.
Where does the standard specify this?
It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
add a comment |
How is this refuted? Does "pointer to the same object" refer to
addresses, even if no objects are there
No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.
But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
Consider the Standard's definition of "object":
object
region of data storage in the execution environment, the contents of
which can represent values
(C 2011, 3.15/1)
Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.
(not like the compiler could
know, anyway)?
Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.
Should we simply understand that it is
implementation-defined since the previous results were already
implementation-defined?
Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.
Where does the standard specify this?
It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.
How is this refuted? Does "pointer to the same object" refer to
addresses, even if no objects are there
No, I don't think that would be a plausible reading. If you stipulate that the pointer value is not a pointer to an object (and if it is not a null pointer) then an equality comparison of that (pointer) value with itself does not satisfy the "only if" condition of 6.5.9/6, and therefore the comparison must evaluate to 0.
But not so fast. Who says that (struct A *) 1 is not a pointer to an object?
Consider the Standard's definition of "object":
object
region of data storage in the execution environment, the contents of
which can represent values
(C 2011, 3.15/1)
Note that the definition is not inherently limited to objects that are allocated or declared by the program. To the best of my knowledge, the standard nowhere limits the scope of the term in that way. It does define means to allocate objects, but it does not specify that objects allocated in one of those ways are the only ones that exist. Thus, implementations are free to interpret that pointer value as a pointer to an object, in which case the equality comparison must evaluate to 1.
(not like the compiler could
know, anyway)?
Of course the compiler could and should know. It has to know in order to evaluate expressions such as you present. The most straightforward approach -- and, not coincidentally, the most common -- is to interpret every non-null pointer value that is not a trap representation as a pointer to an object.
Should we simply understand that it is
implementation-defined since the previous results were already
implementation-defined?
Being implementation-defined carries a requirement for conforming implementations to document their choice. The behavior you're asking about may follow from the implementation-defined behavior of converting an integer to a pointer, but it is not implementation-defined itself.
Where does the standard specify this?
It does not specify. In principle, conforming implementations may differ on this point. In practice, however, they're pretty consistent.
answered 46 mins ago
John BollingerJohn Bollinger
86k74280
86k74280
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
add a comment |
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
Note also the Committee response to C defect report 260, in which the Committee holds that "[Implementations] may also treat pointers based on different origins as distinct even though they are bitwise identical." That could be taken as applying to the example case, so again, the standard does not specify.
– John Bollinger
7 mins ago
add a comment |
Constraint violation
An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5
With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.
Next code tries to initialize a below.
struct A * a = (struct A *) 1;
Initialization constraints include:
No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2
It is not defined that (struct A *) 1 meets that constraint.
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole ofa. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this:struct int a; x = .b = 1;.
– John Bollinger
17 secs ago
add a comment |
Constraint violation
An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5
With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.
Next code tries to initialize a below.
struct A * a = (struct A *) 1;
Initialization constraints include:
No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2
It is not defined that (struct A *) 1 meets that constraint.
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole ofa. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this:struct int a; x = .b = 1;.
– John Bollinger
17 secs ago
add a comment |
Constraint violation
An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5
With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.
Next code tries to initialize a below.
struct A * a = (struct A *) 1;
Initialization constraints include:
No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2
It is not defined that (struct A *) 1 meets that constraint.
Constraint violation
An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation. C17dr §6.3.2.3 5
With (struct A *) 1 code attempts the conversion. The result is implementation-defined, may lack alignment, ... might be a trap.
Next code tries to initialize a below.
struct A * a = (struct A *) 1;
Initialization constraints include:
No initializer shall attempt to provide a value for an object not contained within the entity being initialized. §6.7.9 2
It is not defined that (struct A *) 1 meets that constraint.
answered 40 mins ago
chuxchux
85.4k874158
85.4k874158
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole ofa. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this:struct int a; x = .b = 1;.
– John Bollinger
17 secs ago
add a comment |
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole ofa. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this:struct int a; x = .b = 1;.
– John Bollinger
17 secs ago
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole of
a. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this: struct int a; x = .b = 1;.– John Bollinger
17 secs ago
I'm having great difficulty accepting your application of 6.7.9.2. From what I can see, the initializer is providing a value for the whole of
a. I don't think that provision has anything to do with the value specified. What it forbids is declarations like this: struct int a; x = .b = 1;.– John Bollinger
17 secs ago
add a comment |
This comparison between 2 pointers to arbitrary objects is implementation defined.
Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.
A detailed discussion is here. In this detailed explanation you can see a concrete example so:
Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first.
add a comment |
This comparison between 2 pointers to arbitrary objects is implementation defined.
Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.
A detailed discussion is here. In this detailed explanation you can see a concrete example so:
Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first.
add a comment |
This comparison between 2 pointers to arbitrary objects is implementation defined.
Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.
A detailed discussion is here. In this detailed explanation you can see a concrete example so:
Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first.
This comparison between 2 pointers to arbitrary objects is implementation defined.
Not every architecture allow the pointers to any possible integer value. Not every architecture is able to keep a pointer that represents the location 1000 (or whatever integer), maybe because its assembly language miss such a feature. The C language does not impose any representation for a memory location -- on some architectures the address 1000 may have no meaning.
A detailed discussion is here. In this detailed explanation you can see a concrete example so:
Note that the pointers p and q point to the same memory address. Still the expression p == q evaluates to false which is very surprising at first.
edited 37 mins ago
answered 2 hours ago
alinsoaralinsoar
9,39513354
9,39513354
add a comment |
add a comment |
Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.
This however should be OK:
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return (int)a == (int)b;
Since you convert an integer to a pointer and back again to get the original value.
4
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
add a comment |
Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.
This however should be OK:
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return (int)a == (int)b;
Since you convert an integer to a pointer and back again to get the original value.
4
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
add a comment |
Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.
This however should be OK:
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return (int)a == (int)b;
Since you convert an integer to a pointer and back again to get the original value.
Strictly speaking, this is undefined behavior because neither a nor b point to an object and (most likely) the converted values are not properly aligned.
This however should be OK:
struct A * a = (struct A *) 1;
struct A * b = (struct A *) 1;
return (int)a == (int)b;
Since you convert an integer to a pointer and back again to get the original value.
answered 2 hours ago
dbushdbush
104k14110148
104k14110148
4
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
add a comment |
4
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
4
4
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
But what exactly in the standard makes it UB?
– PSkocik
2 hours ago
add a comment |
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function
Both a and b refer to the same (invalid) memory address i.e. 0x1
Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location
add a comment |
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function
Both a and b refer to the same (invalid) memory address i.e. 0x1
Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location
add a comment |
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function
Both a and b refer to the same (invalid) memory address i.e. 0x1
Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location
Two pointers compare equal if and only if both are null pointers, both are pointers to the same object (including a pointer to an object and a subobject at its beginning) or function
Both a and b refer to the same (invalid) memory address i.e. 0x1
Hence they are equal. The quotation does not mean that the referred objects are equal per se, but that the memory addresses refer to the same location
edited 1 hour ago
answered 2 hours ago
CratylusCratylus
34k53177301
34k53177301
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55764953%2fcs-equality-operator-on-converted-pointers%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
What is "Except as previously specified" referring to? That might be important. Also, as far as Trap Representation is concerned, is it referring to the object supposedly pointed to, or is it referring to the pointer itself having trap representation perhaps as a result of misalignment?
– Christian Gibbons
2 hours ago
They appeared to compare equal coliru.stacked-crooked.com/a/0ca45c3b900ade34 even with
-O3. Strange...– St.Antario
2 hours ago
2
@ChristianGibbons That refers to the null pointer constant case.
– Acorn
2 hours ago