While porting our application to HP/UX 11.23 Itanium, I came across
this situation where the compiler acts differently to any other UNIX
C/C++ compiler that I have come across in the last 10 years (including
other HP-UX platforms).
Consider the following code:
#include <stdio.h>
int main()
{
char *ptr = "AB";
char *ans;
ans = (*ptr++) ? ptr : "";
printf ("Answer is %s\n", ans);
return 0;
}
When running this, I would usually expect to see:
Answer is B
On Itanium it displays:
Answer is AB
There are a few HPUX compilers to choose from on this platform, but
they all behave in the same way. Compiler switches don't make any
difference. I am now using GCC, which works as I expect.
aCC on HPUX 11 PA-RISC also displays "AB".
Has anyone come across this before or confirm that the results I've
seen are invalid for ANSI C?
Sion.
Nov 14 '05
20 2335
Richard Tobin (ri*****@cogsci .ed.ac.uk) wrote:
: In article <cn**********@y in.interaccess. com>,
: Kenny McCormack <ga*****@intera ccess.com> wrote:
: >The idea of the above is that in:
: > ans = (*ptr++) ? ptr : "";
: >
: >"ptr" is "supposed" to be incremented after it is tested but before its
: >value is fetched and assigned to "ans". The pedants in this group will
: >probably point out that this behavior is not required by "the standard".
: No. The standard says there is a sequence point after the first operand
: of the ? operator.
: -- Richard
Right, we finally saw that too. This is CR JAGae79312:
Incorrect order of evaluation for: (x++) ? x ...
This is fixed in A.05.57: http://h21007.www2.hp.com/dspp/tech/...3,1743,00.html
In article <cn**********@y in.interaccess. com>, ga*****@yin.int eraccess.com (Kenny McCormack) wrote: The idea of the above is that in:
ans = (*ptr++) ? ptr : "";
"ptr" is "supposed" to be incremented after it is tested but before its value is fetched and assigned to "ans". The pedants in this group will probably point out that this behavior is not required by "the standard".
Only pedants who don't know C. Those who know C will replace "supposed"
with "required" and remove the quotes:
"ptr" is absolutely, one hundred percent required to be incremented
after it is tested but before its value is fetched and assigned to
"ans".
In article <ch************ *************** ******@slb-newsm1.svr.pol. co.uk>,
Christian Bau <ch***********@ cbau.freeserve. co.uk> wrote: In article <cn**********@y in.interaccess. com>, ga*****@yin.int eraccess.com (Kenny McCormack) wrote:
The idea of the above is that in:
ans = (*ptr++) ? ptr : "";
"ptr" is "supposed" to be incremented after it is tested but before its value is fetched and assigned to "ans". The pedants in this group will probably point out that this behavior is not required by "the standard".
Only pedants who don't know C. Those who know C will replace "supposed" with "required" and remove the quotes:
"ptr" is absolutely, one hundred percent required to be incremented after it is tested but before its value is fetched and assigned to "ans".
Well, that is good to know. Always nice to hear of instances where
sensible behavior is required by the standard.
Lawrence Kirby wrote: >>Consider the following code: >> >> #include <stdio.h> >> >> int main() >> { >> char *ptr = "AB"; >> char *ans; >> >> ans = (*ptr++) ? ptr : ""; >> >> printf ("Answer is %s\n", ans); >> >> return 0; >> }
"If an attempt is made to modify the result of a conditional operator or to access it after the next sequence point, the behavior is undefined".
Does the "access it" part apply to the OP's code or am I just misinterpreting the standard?
I don't know what that means.
The standard talks about modifying the RESULT of the conditional operator or accessing after the next sequence point, which the OPs code does not do.
I still don't understand.
Would you please change the code in the above program to something
which does attempt to access the result of the conditional
operator after the next sequence point,
to better illustrate what you and the standard are talking about?
--
pete
Christian Bau wrote: ans = (*ptr++) ? ptr : "";
"ptr" is absolutely, one hundred percent required to be incremented after it is tested but before its value is fetched and assigned to "ans".
I don't see ptr being tested.
*ptr++ is tested.
ptr may be incremented before the test instead of after.
It is the result of the postfix increment operation
which is the operand of the indirection operator. *(ptr++)
--
pete
In article <41***********@ mindspring.com> ,
pete <pf*****@mindsp ring.com> wrote: Lawrence Kirby wrote:
> >>Consider the following code: > >> > >> #include <stdio.h> > >> > >> int main() > >> { > >> char *ptr = "AB"; > >> char *ans; > >> > >> ans = (*ptr++) ? ptr : ""; > >> > >> printf ("Answer is %s\n", ans); > >> > >> return 0; > >> } "If an attempt is made to modify the result of a conditional > operator or to access it after the next sequence point, > the behavior is undefined". Does the "access it" part apply to the OP's code or am I just > misinterpreting the standard?
I don't know what that means.
The standard talks about modifying the RESULT of the conditional operator or accessing after the next sequence point, which the OPs code does not do.
I still don't understand. Would you please change the code in the above program to something which does attempt to access the result of the conditional operator after the next sequence point, to better illustrate what you and the standard are talking about?
It is a very obscure thing, and difficult to write code that actually
creates the situation. Something like this:
typedef struct { int x; int a [2]; } mystruct;
static mystruct r, s;
static int i;
(i > 0 ? r : s).a [1] = 0;
The result of the ?: is some object, but not one of the objects r, s: It
is an unnamed object which contains either a copy of r or a copy of s.
Modifying that unnamed object invokes undefined behavior. You may have
to do some more work to make this compile. dh*****@convex. hp.com (Dennis Handly) wrote in message news:<41******* *@usenet01.boi. hp.com>... Richard Tobin (ri*****@cogsci .ed.ac.uk) wrote: : In article <cn**********@y in.interaccess. com>, : Kenny McCormack <ga*****@intera ccess.com> wrote: : >The idea of the above is that in: : > ans = (*ptr++) ? ptr : ""; : > : >"ptr" is "supposed" to be incremented after it is tested but before its : >value is fetched and assigned to "ans". The pedants in this group will : >probably point out that this behavior is not required by "the standard".
: No. The standard says there is a sequence point after the first operand : of the ? operator. : -- Richard
Right, we finally saw that too. This is CR JAGae79312: Incorrect order of evaluation for: (x++) ? x ...
This is fixed in A.05.57: http://h21007.www2.hp.com/dspp/tech/...3,1743,00.html
Dennis,
Thank you for this information. This is exactly what I wanted to know.
Sion.
On Tue, 16 Nov 2004 02:32:39 +0000, pete wrote: Christian Bau wrote:
> ans = (*ptr++) ? ptr : ""; "ptr" is absolutely, one hundred percent required to be incremented after it is tested but before its value is fetched and assigned to "ans".
I don't see ptr being tested.
True, although its value is used in the text expression.
*ptr++ is tested.
True
ptr may be incremented before the test instead of after.
True
It is the result of the postfix increment operation which is the operand of the indirection operator. *(ptr++)
True, and the result of that operation is the unincremented value of ptr.
But you are correct that this doesn't stop the ptr object having an
incremented value written to it first.
Lawrence
"Christian Bau" <ch***********@ cbau.freeserve. co.uk> wrote in message
news:ch******** *************** **********@slb-newsm1.svr.pol. co.uk... It is a very obscure thing, and difficult to write code that actually creates the situation. Something like this:
typedef struct { int x; int a [2]; } mystruct; static mystruct r, s; static int i;
(i > 0 ? r : s).a [1] = 0;
The result of the ?: is some object, but not one of the objects r, s: It is an unnamed object which contains either a copy of r or a copy of s. Modifying that unnamed object invokes undefined behavior. You may have to do some more work to make this compile.
I guess the "proper" way to achieve this would be :
(i > 0 ? &r : &s)->a[1] = 0;
Are we dealing with the same issue in the code :
(ignore_case ? strcasecmp : strcmp) (s1, s2);
assuming proper declaration of strcasecmp.
How should it be written then ?
Chqrlie.
PS: I put emphasis around proper to express that standard compliant does not
necessarily mean readable and advisable.
Christian Bau wrote: In article <41***********@ mindspring.com> , pete <pf*****@mindsp ring.com> wrote:
Lawrence Kirby wrote:
>> >>Consider the following code: >> >> >> >> #include <stdio.h> >> >> >> >> int main() >> >> { >> >> char *ptr = "AB"; >> >> char *ans; >> >> >> >> ans = (*ptr++) ? ptr : ""; >> >> >> >> printf ("Answer is %s\n", ans); >> >> >> >> return 0; >> >> }
>> "If an attempt is made to modify the result of a conditional >> operator or to access it after the next sequence point, >> the behavior is undefined".
>> Does the "access it" part apply to the OP's code or am I just >> misinterpreting the standard? > > I don't know what that means.
The standard talks about modifying the RESULT of the conditional operator or accessing after the next sequence point, which the OPs code does not do.
I still don't understand. Would you please change the code in the above program to something which does attempt to access the result of the conditional operator after the next sequence point, to better illustrate what you and the standard are talking about?
It is a very obscure thing, and difficult to write code that actually creates the situation. Something like this:
typedef struct { int x; int a [2]; } mystruct; static mystruct r, s; static int i;
(i > 0 ? r : s).a [1] = 0;
The result of the ?: is some object, but not one of the objects r, s: It is an unnamed object which contains either a copy of r or a copy of s. Modifying that unnamed object invokes undefined behavior. You may have to do some more work to make this compile.
Thank you.
--
pete This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Bernhard Mulder |
last post by:
I am using Python on Itanium Windows 64 (Server 2003) with a Win32 version.
Is there a native version available or planned? Are testers needed for
this platform?
Windows 64 is a bit unusual in that "long" is not large enough to hold
an address.
|
by: Bernard Delmée |
last post by:
Hello,
because we are migrating to an Itanium HP-UX server,
I will shortly need to compile python 2.3 and cx_oracle
on that platform. I seem to recall people having problem
compiling python on HP-UX in general, and am interested
in opinions about which compiler to use. Should I require
the HP compiler, or is gcc known to work for this purpose ?
Thanks for any hint,
|
by: JB_Nikegolf |
last post by:
I am replacing a production database. Initially I sized a Quad 2.8
GHz with 8 GB of Ram. I will be running Windows 2003 Enterprise
Server with Sql Server 2000 Enterprise. I was wondering what kind of
performance I would (better/worse) get from a Dual 1.5 GHz Itanium
with 8 GB of Ram running the 64 bit versions of Windows 2003 and Sql
Server. Hardware cost are pretty comparable, but I could save on Sql
Server licenses. Anyone that has...
|
by: Jack |
last post by:
We are migrating an application to DB2 on Itanium and have 1 Java
function. We are running RHEL AS 3.2 and have been able to upgrade
Java on our x86 environment to IBMJava2 141 with no problems. I have
not been able to find a copy of IBMJava2 141 for IA64 which makes me
wonder whether it exists. If it does exist can someone tell me where.
Otherwise, what are my options in the IA64 world? will IBMJava 131-9
work with DB2 on IA64? If...
|
by: onion |
last post by:
who knows that software serves in order to compile a projetcs c++ (VC7) for
ITANIUM with Windows Serveur 2003.
| |
by: John Gibson |
last post by:
Hi, all.
I need to upgrade my dual Xeon PostgreSQL engine.
Assuming similar memory and disk sub-systems, I am considering a Quad
Xeon system vs. a Dual Itanium for PostgreSQL. I believe that the
PostgreSQL code is written for 32 bit and not optimized for the 64 bit
Itanium cpu. That makes me think that the Xeon system would be a better
choice.
|
by: csgrimes1 |
last post by:
Anyone know where else I can download 2.6 for x64 windows?
Thanks!
|
by: Christopher |
last post by:
Hello,
A tool that we use needs to be ported to Itanium. It wsa written
for Python 2.5.2, and so I was happily using the Itanium version of
that release. However, as I have gotten deeper into the port, I see
that ctypes was not included with the Itanium Python 2.5.2 release.
I need to compile that module for that release and platform, but I
have been unable to discover which MS compiler version and runtime was
used to generate the...
|
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: 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 synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
|
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.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
| |
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 most users, this new feature is actually very convenient. If you want to control the update process,...
|
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: 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...
| |