The C99 standard states:
"In the abstract machine, all expressions are evaluated as specified
by the semantics. An actual implementation need not evaluate part
of an expression if it can deduce that its value is not used and
that no needed side effects are produced (including any caused by
calling a function or accessing a volatile object)."
Does that mean that in the following code, *p does not have to
be evaluated since its side effects are not truly needed?:
extern volatile int *p;
int main(void)
{
*p;
return 0;
} 17 2329 di************* @aol.com wrote On 10/10/05 15:26,: The C99 standard states: "In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object)."
Does that mean that in the following code, *p does not have to be evaluated since its side effects are not truly needed?:
extern volatile int *p;
int main(void) { *p; return 0; }
Just the opposite: Since `p' points to an `int' that
is volatile, and since accessing a volatile object is a
side-effect, `*p' must be evaluated -- or at any rate,
the access it implies must be performed. This code might,
for example, be part of a program named IgnoreStatus, whose
entire purpose is to un-wedge a device that's refusing to
do anything until it's been tickled by somebody reading
its memory-mapped status register.
-- Er*********@sun .com
Eric Sosman <er*********@su n.com> writes: di************* @aol.com wrote On 10/10/05 15:26,: The C99 standard states: "In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object)."
Does that mean that in the following code, *p does not have to be evaluated since its side effects are not truly needed?:
extern volatile int *p;
int main(void) { *p; return 0; }
Just the opposite: Since `p' points to an `int' that is volatile, and since accessing a volatile object is a side-effect, `*p' must be evaluated -- or at any rate, the access it implies must be performed. This code might, for example, be part of a program named IgnoreStatus, whose entire purpose is to un-wedge a device that's refusing to do anything until it's been tickled by somebody reading its memory-mapped status register.
Right -- unless the compiler knows somehow that accessing *p doesn't
actually have a "needed side effect". But since the user went out of
his way to declare it volatile, it's unlikely that a compiler would go
to the effort to prove this, especially since it might be wrong.
--
Keith Thompson (The_Other_Keit h) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
Keith Thompson wrote On 10/10/05 16:31,: Eric Sosman <er*********@su n.com> writes:
di*********** **@aol.com wrote On 10/10/05 15:26,:
The C99 standard states: "In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object)."
Does that mean that in the following code, *p does not have to be evaluated since its side effects are not truly needed?:
extern volatile int *p;
int main(void) { *p; return 0; }
Just the opposite: Since `p' points to an `int' that is volatile, and since accessing a volatile object is a side-effect, `*p' must be evaluated -- or at any rate, the access it implies must be performed. This code might, for example, be part of a program named IgnoreStatus, whose entire purpose is to un-wedge a device that's refusing to do anything until it's been tickled by somebody reading its memory-mapped status register.
Right -- unless the compiler knows somehow that accessing *p doesn't actually have a "needed side effect". But since the user went out of his way to declare it volatile, it's unlikely that a compiler would go to the effort to prove this, especially since it might be wrong.
Right (back at'cha). It is, however, rather difficult to
reason about volatile in a portable way. The Standard requires
that all the accesses the abstract machine would make must
actually be made, but since the implementation gets to define
what "access" means ...
-- Er*********@sun .com
"Eric Sosman" <er*********@su n.com> wrote in message
news:di******** **@news1brm.Cen tral.Sun.COM... Keith Thompson wrote On 10/10/05 16:31,: Eric Sosman <er*********@su n.com> writes:
di********** ***@aol.com wrote On 10/10/05 15:26,:
The C99 standard states: "In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object)."
Does that mean that in the following code, *p does not have to be evaluated since its side effects are not truly needed?:
extern volatile int *p;
int main(void) { *p; return 0; }
Just the opposite: Since `p' points to an `int' that is volatile, and since accessing a volatile object is a side-effect, `*p' must be evaluated -- or at any rate, the access it implies must be performed. This code might, for example, be part of a program named IgnoreStatus, whose entire purpose is to un-wedge a device that's refusing to do anything until it's been tickled by somebody reading its memory-mapped status register.
Right -- unless the compiler knows somehow that accessing *p doesn't actually have a "needed side effect". But since the user went out of his way to declare it volatile, it's unlikely that a compiler would go to the effort to prove this, especially since it might be wrong.
Right (back at'cha). It is, however, rather difficult to reason about volatile in a portable way. The Standard requires that all the accesses the abstract machine would make must actually be made, but since the implementation gets to define what "access" means ...
We do a lot of embedded C code so we test compiliers on how they handle
volatile data types. Some of the test code we use is so abreviated as to
have no real functionality other than to test the code generator.
One compiler we tested claims to conform with ISO C but has a somewhat
nonconformist way of working with volatile data types.
Specifically:
int volatile a;
void test1(void)
{
a = a + 0;
}
void test2(void)
{
a += 0;
}
The code produced by function test1 was correct.
The variable 'a' was read then written.
The code produced by function test2 was incorrect.
The variable 'a' was read but not written.
When we suggested that the code for test2 did not conform we were told the
expression has only one sequence point and that the generated code was
correct.
We did not use that compiler.
Not because there was not a way to work around this particular issue but
because there was now way to know how many more of these kinds of things may
be lurking within their code generator.
Keyser Soze wrote:
<snip> We do a lot of embedded C code so we test compiliers on how they handle volatile data types. Some of the test code we use is so abreviated as to have no real functionality other than to test the code generator.
One compiler we tested claims to conform with ISO C but has a somewhat nonconformist way of working with volatile data types.
Specifically:
int volatile a;
void test1(void) { a = a + 0; }
void test2(void) { a += 0; }
The code produced by function test1 was correct.
The variable 'a' was read then written.
The code produced by function test2 was incorrect.
The variable 'a' was read but not written.
When we suggested that the code for test2 did not conform we were told the expression has only one sequence point and that the generated code was correct.
Using compound assignment operators when dealing with
volatile-qualified objects that are "sensitive" to the difference
(usually hardware registers) is a classic no-no. Here's my best
explanation:
C99: 5.1.2.3 Program execution
[#6] The least requirements on a conforming implementation are:
-- At sequence points, volatile objects are stable in the
sense that previous accesses are complete and
subsequent accesses have not yet occurred.
GCC 4.02 Manual:
4 C Implementation-defined behavior
4.10 Qualifiers - When is a Volatile Object Accessed?
[...]
The minimum either standard specifies is that at a
sequence point all previous accesses to volatile objects
have stabilized and no subsequent accesses have occurred.
Thus an implementation is free to reorder and combine
volatile accesses which occur between sequence points,
but cannot do so for accesses across a sequence point.
6.7.3 Type qualifiers
[#6] An object that has volatile-qualified type may be
modified in ways unknown to the implementation or have other
unknown side effects. Therefore any expression referring to
such an object shall be evaluated strictly according to the
rules of the abstract machine [...]
6.5.16.2 Compound assignment
[#3] A compound assignment of the form E1 op= E2 differs
from the simple assignment expression E1 = E1 op (E2) only
in that the lvalue E1 is evaluated only once.
"E1" is evaluated "only once", and implementations are (at least
according to the GCC group's interpretation) "free to reorder and
combine volatile accesses which occur between sequence points". I
believe the compiler's behavior in this case is conforming.
At least that's my interpretation. Dissent or confirmation is welcome.
Personally speaking, I have never used compound assignment to
volatile-qualified types in any device drivers I've ever written.
<snip>
Mark F. Haigh mf*****@sbcglob al.net
"Mark F. Haigh" <mf*****@sbcglo bal.net> wrote in message
news:11******** **************@ g49g2000cwa.goo glegroups.com.. . Keyser Soze wrote: <snip> We do a lot of embedded C code so we test compiliers on how they handle volatile data types. Some of the test code we use is so abreviated as to have no real functionality other than to test the code generator.
One compiler we tested claims to conform with ISO C but has a somewhat nonconformist way of working with volatile data types.
Specifically:
int volatile a;
void test1(void) { a = a + 0; }
void test2(void) { a += 0; }
The code produced by function test1 was correct.
The variable 'a' was read then written.
The code produced by function test2 was incorrect.
The variable 'a' was read but not written.
When we suggested that the code for test2 did not conform we were told the expression has only one sequence point and that the generated code was correct.
Using compound assignment operators when dealing with volatile-qualified objects that are "sensitive" to the difference (usually hardware registers) is a classic no-no. Here's my best explanation:
C99: 5.1.2.3 Program execution
[#6] The least requirements on a conforming implementation are:
-- At sequence points, volatile objects are stable in the sense that previous accesses are complete and subsequent accesses have not yet occurred.
GCC 4.02 Manual: 4 C Implementation-defined behavior 4.10 Qualifiers - When is a Volatile Object Accessed?
[...] The minimum either standard specifies is that at a sequence point all previous accesses to volatile objects have stabilized and no subsequent accesses have occurred. Thus an implementation is free to reorder and combine volatile accesses which occur between sequence points, but cannot do so for accesses across a sequence point.
6.7.3 Type qualifiers
[#6] An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine [...]
6.5.16.2 Compound assignment
[#3] A compound assignment of the form E1 op= E2 differs from the simple assignment expression E1 = E1 op (E2) only in that the lvalue E1 is evaluated only once.
"E1" is evaluated "only once", and implementations are (at least according to the GCC group's interpretation) "free to reorder and combine volatile accesses which occur between sequence points". I believe the compiler's behavior in this case is conforming.
At least that's my interpretation. Dissent or confirmation is welcome. Personally speaking, I have never used compound assignment to volatile-qualified types in any device drivers I've ever written.
The standard and implementation guides are a little vague and hand wavy on
just exactly what is meant by "evaluated only once" when processing a
compound assignment involving a volatile data type.
--------------------
ansi_iso_iec_98 99, Section 6.7.3, footnote:
114) A volatile declaration may be used to describe an object corresponding
to a memory-mapped input/output port or an object accessed by an
asynchronously interrupting function. Actions on objects so declared shall
not be "optimized out" by an implementation or reordered except as permitted
by the rules for evaluating expressions.
--------------------
The syntax of the statement would imply that one read and one write would
always be performed on the volatile lvalue of a compound assignment.
This would seem to require that compound assignments to volatile lvaues have
two sequence points. One at the "read" evaluation of E1 and one at the
"write" operation of E2.
The bottom line here seems to be if you need to use volatile data types to
access hardware you had better take a good look at an example of the
generated code for side affects.
Keyser Soze wrote: "Mark F. Haigh" <mf*****@sbcglo bal.net> wrote in message news:11******** **************@ g49g2000cwa.goo glegroups.com.. . Keyser Soze wrote:
<snip> "E1" is evaluated "only once", and implementations are (at least according to the GCC group's interpretation) "free to reorder and combine volatile accesses which occur between sequence points". I believe the compiler's behavior in this case is conforming.
At least that's my interpretation. Dissent or confirmation is welcome. Personally speaking, I have never used compound assignment to volatile-qualified types in any device drivers I've ever written.
The standard and implementation guides are a little vague and hand wavy on just exactly what is meant by "evaluated only once" when processing a compound assignment involving a volatile data type.
--------------------
ansi_iso_iec_98 99, Section 6.7.3, footnote:
114) A volatile declaration may be used to describe an object corresponding to a memory-mapped input/output port or an object accessed by an asynchronously interrupting function. Actions on objects so declared shall not be "optimized out" by an implementation or reordered except as permitted by the rules for evaluating expressions.
--------------------
The syntax of the statement would imply that one read and one write would always be performed on the volatile lvalue of a compound assignment.
This would seem to require that compound assignments to volatile lvaues have two sequence points. One at the "read" evaluation of E1 and one at the "write" operation of E2.
Footnotes are not normative: See the C99 Forward:
[#6] [...] In accordance with the
ISO/IEC Directives, Part 3, this foreword, the introduction,
notes, footnotes, and examples are for information only. The bottom line here seems to be if you need to use volatile data types to access hardware you had better take a good look at an example of the generated code for side affects.
Agreed, but using compound assignments to write hardware registers is
never a good idea.
Mark F. Haigh mf*****@sbcglob al.net
Eric Sosman wrote: Mark F. Haigh wrote On 10/11/05 16:01,: Footnotes are not normative: See the C99 Forward:
[#6] [...] In accordance with the ISO/IEC Directives, Part 3, this foreword, the introduction, notes, footnotes, and examples are for information only.
But the Foreword (not "Forward") is also non-normative! Why should we believe anything it says? In particular, why should we believe what it says about footnotes?
(And the reference to ISO/IED directives is within the non-normative Foreword, so it can't be taken seriously ;-)
Nice! How about :
The ISO/IEC Directives, Part 3, section 6.5, classify footnotes to text
as "other informative elements", and as such are not considered to be
normative.
Mark F. Haigh mf*****@sbcglob al.net
Eric Sosman <er*********@su n.com> writes: Mark F. Haigh wrote On 10/11/05 16:01,: Footnotes are not normative: See the C99 Forward:
[#6] [...] In accordance with the ISO/IEC Directives, Part 3, this foreword, the introduction, notes, footnotes, and examples are for information only.
But the Foreword (not "Forward") is also non-normative! Why should we believe anything it says? In particular, why should we believe what it says about footnotes?
How do you know that the Foreword is non-normative? You seem to
believe that it is so only on the basis of what the Foreword
says, but that's not a valid source because it is non-normative.
--
Are we recursing yet? This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Krhis |
last post by:
A friend of mine gave me a link to these two sites, he wanted to know
the scripts that are used here... but it seems that not even I can
help him. So I am hoping some one else could help us by showing were
we could get the sources of these two "fade" effects.
Text links are blue, but when you put your mouse on them, they turn
white (from...
|
by: Miles Davenport |
last post by:
I would like some advice on what Java server-side alternatives their are to
an applet which is a shopping cart application which allows the user to
drag-and-drop individual items into "an order" panel within the applet
environment on the browser client.
I am eager to port this application, as the rest of the site uses JSP,
servlets, XML,...
|
by: Tobiah |
last post by:
Ok,
I miss the idiom that my other languages use,
something like:
while( foo = getmore()){
process(foo);
}
|
by: Ramki |
last post by:
Hi,
I want to call a PERL program from MS-DOS batch file.
Following is just an example, the string may inturn have double quote
or single quote.
I can't call with arg1, arg2 etc, as the input will be dyanamic.
My argument may be something like this "204.120.69.195" "-""-" 'xyz'
"GET"
Perl should receive the whole string as a single...
|
by: Sean McKaharay |
last post by:
I am using the code below and I am getting this error:
"Insufficient state to deserialize the object. More information is needed."
Has anyone seen this? It is working with other dll's but not on a certain
one. Can some help?
private void LoadAssembly(string DllLocationDirectory, string
applicationName, bool shadowCopyFiles, string...
| |
by: R.Z. |
last post by:
i'm using a class from some api that is said to automatically call its
destructor when its out of scope and deallocate memory. i create instances
of this class using "new" operator. do i have to explicitly call delete on
these instances when i no longer need them?
|
by: Lauren Wilson |
last post by:
A2K app:
Question: is the flagged line (<<<) below necessary. If that line is
needed, what effect does it have (if any) on the fact that the very
same database is the linked back end db?
Dim db As DAO.Database
Dim rst As DAO.Recordset
|
by: Vincent Delporte |
last post by:
Hi
I'm a Python newbie, and would like to rewrite this Perl scrip
to be run with the Asterisk PBX:
http://www.voip-info.org/wiki/view/Asterisk+NetCID
Anyone knows if those lines are necessary, why, and what their
alternative is in Python?
|
by: 2Barter.net |
last post by:
newsmail@reuters.uk.ed10.net Fwd: Money for New Orleans, AL & GA
Inbox
Reply
Reply to all
Forward
Print
Add 2Barter.net to Contacts list
Delete this message
Report phishing
Show original
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language...
| |
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it. ...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert...
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...
| |