Hi all,
Why do I get a warning from gcc with the following program?
[test]$ cat test.c
#include <stdio.h>
int f(int n)
{
return n;
}
int main(void)
{
int n = 0;
printf("%i\n", f(n++) + n);
return 0;
}
[test]$ gcc -Wall test.c
test.c: In function ‘main’:
test.c:13: warning: operation on ‘n’ may be undefined
One of the sequence point cases is defined as: "The point of calling a
function, after evaluating its arguments." If I got it right, that rule
can be applied to `f(n++)' which is evaluated before `n' since addition
is left associative. I can't see the ambiguity here.
August
(I would never write this kind of code in practice, but it's good to
know how the standard is defined.) 7 2080
akarl wrote: Hi all,
Why do I get a warning from gcc with the following program?
[test]$ cat test.c #include <stdio.h>
int f(int n) { return n; }
int main(void) { int n = 0;
printf("%i\n", f(n++) + n); return 0; }
[test]$ gcc -Wall test.c test.c: In function ‘main’: test.c:13: warning: operation on ‘n’ may be undefined
One of the sequence point cases is defined as: "The point of calling a function, after evaluating its arguments." If I got it right, that rule can be applied to `f(n++)' which is evaluated before `n' since addition is left associative. I can't see the ambiguity here.
That's not what left associative means.
--
pete
pete wrote: akarl wrote:
Hi all,
Why do I get a warning from gcc with the following program?
[test]$ cat test.c #include <stdio.h>
int f(int n) { return n; }
int main(void) { int n = 0;
printf("%i\n", f(n++) + n); return 0; }
[test]$ gcc -Wall test.c test.c: In function ‘main’: test.c:13: warning: operation on ‘n’ may be undefined
One of the sequence point cases is defined as: "The point of calling a function, after evaluating its arguments." If I got it right, that rule can be applied to `f(n++)' which is evaluated before `n' since addition is left associative. I can't see the ambiguity here.
That's not what left associative means.
Yes, of course (only one addition operation). How stupid of me. So the
ambiguity here is that the *evaluation order* of the operands of `+' is
unspecified, right?
August
On Thu, 11 Aug 2005 02:15:14 GMT, akarl <fu********@com hem.se> wrote
in comp.lang.c: Hi all,
Why do I get a warning from gcc with the following program?
[test]$ cat test.c #include <stdio.h>
int f(int n) { return n; }
int main(void) { int n = 0;
printf("%i\n", f(n++) + n); return 0; }
[test]$ gcc -Wall test.c test.c: In function ‘main’: test.c:13: warning: operation on ‘n’ may be undefined
Yes, the operation on 'n' may be undefined. The standard says:
"Between the previous and next sequence point an object shall have its
stored value modified at most once by the evaluation of an expression.
Furthermore, the prior value shall be read only to determine the value
to be stored."
The printf() call in your call does not modify the value of 'n' more
than once. The expression 'n++' modifies 'n' exactly once, and uses
the original value of 'n' only for the purpose of computing the new
value. But the '+ n' subexpression attempts to access the prior value
of 'n' in a way that is not used in the computation of the new value.
One of the sequence point cases is defined as: "The point of calling a function, after evaluating its arguments." If I got it right, that rule can be applied to `f(n++)' which is evaluated before `n' since addition is left associative. I can't see the ambiguity here.
No, you are wrong, associatively has nothing at all to do with order
of evaluation. Only sequence points impose an order of evaluation.
August
(I would never write this kind of code in practice, but it's good to know how the standard is defined.)
Let's take an example that doesn't have undefined behavior:
#include <stdio.h>
int f1(void)
{
puts("function 1\n");
return 1;
}
int f2(void)
{
puts("function 1\n");
return 2;
}
int main(void)
{
printf("the sum is %d\n", f1() + f2());
return 0;
}
This function does not define or contain any objects at all, so the
paragraph I quoted from the standard certainly does not apply.
Because the order of evaluation between sequence points is
unspecified, the output could be either of the following two
sequences, and must be one of the two:
function 1
function 2
the sum is 3
....or:
function 2
function 1
the sum is 3
In fact, it may change between one and the other if you change the
settings you use to invoke your compiler, for example enable or
disable optimization.
If just so happens that if your compiler evaluates the subexpression
'f(n++)' first, the result is defined because there is a sequence
point imposed by calling the function before the '+ n' subexpression
reads the value of 'n' again.
But if your compiler evaluates 'n' in the '+ n' subexpression before
evaluating the 'f(n++)' subexpression, there is no sequence point
between the unrelated read and the modification, the behavior is
undefined.
Finally, since the order of evaluation is something the standard
states is unspecified, it means that the compiler does not have to
tell you which order it uses, and is free to change it based on
settings, the day of the week, or the phase of the moon.
Since one of the unspecified paths generates undefined behavior, the
whole thing should be treated as undefined.
--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.l earn.c-c++ http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
akarl wrote: pete wrote: akarl wrote:
printf("%i\n", f(n++) + n);
test.c:13: warning: operation on ‘n’ may be undefined
`f(n++)' which is evaluated before `n' since addition is left associative. I can't see the ambiguity here.
That's not what left associative means.
Yes, of course (only one addition operation). How stupid of me. So the ambiguity here is that the *evaluation order* of the operands of `+' is unspecified, right?
Yes. There are rules that say that modifying n
and reading n between sequence points, is undefined,
even though it might seem to be only unspecified.
I think it's good to avoid side effects in function arguments.
I absentmindedly used an argument with side effects in the
Re: A question on string literals
thread, thereby confusing Default User.
It would have been more better if I had
incremented the pointer prior to the function call
instead of in the function call.
--
pete
akarl wrote: Hi all,
Why do I get a warning from gcc with the following program?
[...] printf("%i\n", f(n++) + n);
[...] test.c:13: warning: operation on ‘n’ may be undefined
Because the the value of 'f(n++) + n' is undefined.
One of the sequence point cases is defined as: "The point of calling a function, after evaluating its arguments." If I got it right, that rule can be applied to `f(n++)' which is evaluated before `n' since addition is left associative. I can't see the ambiguity here.
The order of evaluation of the operands f(n++) and n is not defined.
Associativity (which isn't a C concept, anyway) doesn't enter into it.
Jack Klein wrote: On Thu, 11 Aug 2005 02:15:14 GMT, akarl <fu********@com hem.se> wrote in comp.lang.c:
Hi all,
Why do I get a warning from gcc with the following program?
[test]$ cat test.c #include <stdio.h>
int f(int n) { return n; }
int main(void) { int n = 0;
printf("%i\n", f(n++) + n); return 0; }
[test]$ gcc -Wall test.c test.c: In function 'main': test.c:13: warning: operation on 'n' may be undefined Yes, the operation on 'n' may be undefined. The standard says:
"Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored."
The printf() call in your call does not modify the value of 'n' more than once. The expression 'n++' modifies 'n' exactly once, and uses the original value of 'n' only for the purpose of computing the new value. But the '+ n' subexpression attempts to access the prior value of 'n' in a way that is not used in the computation of the new value.
One of the sequence point cases is defined as: "The point of calling a function, after evaluating its arguments." If I got it right, that rule can be applied to `f(n++)' which is evaluated before `n' since addition is left associative. I can't see the ambiguity here.
No, you are wrong, associatively has nothing at all to do with order of evaluation. Only sequence points impose an order of evaluation.
August
(I would never write this kind of code in practice, but it's good to know how the standard is defined.)
Let's take an example that doesn't have undefined behavior:
#include <stdio.h>
int f1(void) { puts("function 1\n"); return 1; }
int f2(void) { puts("function 1\n"); return 2; }
int main(void) { printf("the sum is %d\n", f1() + f2()); return 0; }
This function does not define or contain any objects at all, so the paragraph I quoted from the standard certainly does not apply.
Because the order of evaluation between sequence points is unspecified, the output could be either of the following two sequences, and must be one of the two:
function 1 function 2 the sum is 3
...or:
function 2 function 1 the sum is 3
<nitpick>
or more likely:
function 1
function 1
the sum is 3
</nitpick>
In fact, it may change between one and the other if you change the settings you use to invoke your compiler, for example enable or disable optimization.
If just so happens that if your compiler evaluates the subexpression 'f(n++)' first, the result is defined because there is a sequence point imposed by calling the function before the '+ n' subexpression reads the value of 'n' again.
But if your compiler evaluates 'n' in the '+ n' subexpression before evaluating the 'f(n++)' subexpression, there is no sequence point between the unrelated read and the modification, the behavior is undefined.
Finally, since the order of evaluation is something the standard states is unspecified, it means that the compiler does not have to tell you which order it uses, and is free to change it based on settings, the day of the week, or the phase of the moon.
Since one of the unspecified paths generates undefined behavior, the whole thing should be treated as undefined.
-- Jack Klein Home: http://JK-Technology.Com FAQs for comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html comp.lang.c++ http://www.parashift.com/c++-faq-lite/ alt.comp.lang.l earn.c-c++ http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html
On 10 Aug 2005 23:55:56 -0700, "Suman" <sk*****@gmail. com> wrote in
comp.lang.c: Jack Klein wrote:
[snip] Let's take an example that doesn't have undefined behavior:
#include <stdio.h>
int f1(void) { puts("function 1\n"); return 1; }
int f2(void) { puts("function 1\n"); return 2; }
int main(void) { printf("the sum is %d\n", f1() + f2()); return 0; }
This function does not define or contain any objects at all, so the paragraph I quoted from the standard certainly does not apply.
Because the order of evaluation between sequence points is unspecified, the output could be either of the following two sequences, and must be one of the two:
function 1 function 2 the sum is 3
...or:
function 2 function 1 the sum is 3
<nitpick> or more likely: function 1 function 1 the sum is 3 </nitpick>
Kind of takes the away the whole point of the example, doesn't it?
Makes it really, really indeterminate!
Thanks, Suman, nice catch.
--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.l earn.c-c++ http://www.contrib.andrew.cmu.edu/~a...FAQ-acllc.html This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Dave Theese |
last post by:
Hello all,
I have read the definition of a sequence point in the standard and can
follow it mechanically, but for some reason, I'm having a hard time grasping
the conceptual meaning and significance. Can someone out there offer good
intuition on sequence points???
Thank you!
Dave
|
by: Sensorflo |
last post by:
After browsing though many newsgroups articels I'm still not shure how
operator precedence, operator associativity, sequence points, side
effects go together. Currently I have the following view:
An expression
a = b() + c() * d++;
can be transformed with the rules of operator associativity and
operator precedence into a tree
|
by: Timothy Madden |
last post by:
Hello
I've read a long time ago in the MSDN that C++ language defines no sequence
points
Now I read in the 1998 ISO standard a small list of sequence points in C++
Does C++ defines sequence points ? It really should if anyone asks me ...
Thank you
Timothy Madden
|
by: Deniz Bahar |
last post by:
I know the basic definition of a sequence point (point where all side
effects guaranteed to be finished), but I am confused about this
statement:
"Between the previous and next sequence point an object shall have its
stored value modified at most once by the evaluation of an expression.
Furthermore, the prior value shall be accessed only to determine the
value to be stored."
Can someone give me examples of expressions that "barely"...
|
by: John Smith |
last post by:
I've been playing with splint, which returns the following
warning for the code below:
statlib.c: (in function log_norm_pdf)
statlib.c(1054,31): Expression has undefined behavior (left
operand uses errno,
modified by right operand): (log(x) - mu) * (log(x) - mu)
Code has unspecified behavior. Order of evaluation of function
parameters or
subexpressions is not defined, so if a value is used and
| |
by: lovecreatesbea... |
last post by:
---quoting---
Annex C (informative) Sequence points
1 The following are the sequence points described in 5.1.2.3:
- The end of a full expression: an initializer (6.7.8); the
expression in an expression statement (6.8.3); ...
---quoting ends---
What does a full expression exactly mean?
|
by: Daniel Kraft |
last post by:
Hi all!
I do not have a standard-document right next to me to cite from, but as
far as I know, doing something like:
a()=b()=c()=d();
or
foo(d()+c()+b()+a());
has a fixed evaluation order (right-to-left in the first case and
|
by: joe |
last post by:
Consider the following program:
include <iostream>
class Bar
{ public:
int getData9() { m_data = 9; return m_data;}
int getData11() { m_data = 11; return m_data;}
int m_data;
|
by: Jrdman |
last post by:
hi
According to the standard these are how we define sequence points:
*the call to a function ,after the arguments have been evaluated
*the end of the first operand of the following operators :
{logical AND :&&
|
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 usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
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 captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
| |
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
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 launch it, all on its own....
Now, this would greatly impact the work of software developers. The idea...
|
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 into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
| |
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 effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |