Hi all,
In a discussion with Tak-Shing Chan the question came up whether the
as-if rule can cover I/O functions. Basically, he maintains it can, and
I think it doesn't.
Consider two programs:
/*** a.c ***/
#include <stdio.h>
int main(void)
{
fopen("somefile ","rb");
return 0;
}
/*** b.c ***/
in main(void)
{
return 0;
}
Would it be legal for a compiler (through optimization), to emit the
same code for program a.c and b.c ?
I'd welcome a reference from the standard.
Best regards,
Sidney
Nov 14 '05
145 6333
>Jack Klein <ja*******@spam cop.net> writes: Given your reasoning, and I see nothing to argue with, optimizing away the fopen() is a perfectly acceptable application of the as-if rule on the typical *NIX system, where opening a file leaves no trace in the system.
In article <87************ @pfaff.stanford .edu>,
Ben Pfaff <bl*@cs.stanfor d.edu> wrote:Most Unix-like kernel, including Linux, also maintain "last accessed" times. I don't know why you think they don't.
Moreover, if the file name corresponds to a fifo or named-pipe,
simply opening the file for reading can have an effect. In
particular, opening a fifo for reading will unblock a process
that is suspended in an attempt to write to that fifo:
$ mkfifo foo
$ echo hello > foo &
$ jobs
[1] 18389 echo hello >foo
$ echo zog < foo &
$ zog
jobs
[1] 18389 Exit 0 echo hello >foo
[2] 18390 Exit 0 echo zog <foo
$
If you do this in the opposite order, the attempt to read from the
fifo before there are any writers causes the reading program to
hang until someone opens the fifo for writing. Either way it is
obvious that something has happened, even though it is outside the
limited domain of portable C programming.
--
In-Real-Life: Chris Torek, Wind River Systems
Salt Lake City, UT, USA (40°39.22'N, 111°50.29'W) +1 801 277 2603
email: forget about it http://web.torek.net/torek/index.html
Reading email is like searching for food in the garbage, thanks to spammers.
In article <87************ @pfaff.stanford .edu>,
Ben Pfaff <bl*@cs.stanfor d.edu> wrote: Jack Klein <ja*******@spam cop.net> writes:
Given your reasoning, and I see nothing to argue with, optimizing away the fopen() is a perfectly acceptable application of the as-if rule on the typical *NIX system, where opening a file leaves no trace in the system.
Most Unix-like kernel, including Linux, also maintain "last accessed" times. I don't know why you think they don't.
But it may only be updated if you actually read something from the file;
the act of opening the file in read mode might not update it (consider a
file on an NFS server -- there's nothing in NFS that corresponds to
open() or close(), the server only sees the directory lookup and the
read/write operations).
--
Barry Margolin, ba****@alum.mit .edu
Arlington, MA
*** PLEASE post questions in newsgroups, not directly to me ***
"Douglas A. Gwyn" wrote: Jack Klein wrote:
Then does it follow: -A compiler for platform A may omit the fopen() call under the as-if rule -A compiler for platform B may not omit the fopen() call ...even though the output of the program itself is the same in either case.
The question is whether there is any way, other than timing, code size, and other aspects deemed "inessentia l", to detect whether the code actually performs the call. In a way, this is all a waste of time, because no compiler that I know of would optimize away a call to fopen(). Some *would* optimize away pointless calls to strcmp() etc., in contexts where they know that a standard library function is involved (so that its complete semantics are known) and known not to have any observable effect in the particular case.
Is there some *real* issue lying behind this topic, or is it just a matter of pedanticism?
I think it is purely pedantic. At any rate there is no telling
what the act of opening a file involves, regardless of system. I
have built systems where the act of opening a particular named
file did some major re-arrangement of the entire i/o system, and
the act of closing that file put it back. This kept the
application proper coding standard and restricted the magic to
file system drivers.
--
Chuck F (cb********@yah oo.com) (cb********@wor ldnet.att.net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home .att.net> USE worldnet address!
in comp.std.c i read: On 19 Jan 2004 16:13:33 GMT, Da*****@cern.ch (Dan Pop) wrote in comp.lang.c: The only *relevant* side effects of fopen are those specified in the C standard.
Opening a file in read mode doesn't modify the file, therefore it doesn't count as a side effect, in the context of the C standard.
Given your reasoning, and I see nothing to argue with, optimizing away the fopen() is a perfectly acceptable application of the as-if rule on the typical *NIX system, where opening a file leaves no trace in the system.
actually unices typically do record the time a file was opened. dan might
argue that by itself that isn't sufficient, and in some ways i agree, but
there remains a flaw: there's no way to know whether the FILE object
contains a volatile member or would call the environment since it's
implementation defined.
--
a signature
Douglas A. Gwyn wrote: Jack Klein wrote:
Then does it follow: -A compiler for platform A may omit the fopen() call under the as-if rule -A compiler for platform B may not omit the fopen() call ...even though the output of the program itself is the same in either case.
The question is whether there is any way, other than timing, code size, and other aspects deemed "inessentia l", to detect whether the code actually performs the call. In a way, this is all a waste of time, because no compiler that I know of would optimize away a call to fopen(). Some *would* optimize away pointless calls to strcmp() etc., in contexts where they know that a standard library function is involved (so that its complete semantics are known) and known not to have any observable effect in the particular case.
Is there some *real* issue lying behind this topic, or is it just a matter of pedanticism?
As for me, it's mostly curiosity about the standard's wording:
"Accessing a volatile object, modifying an object, modifying a
file, or calling a function that does any of those operations
are all side effects"
.... If this would just say "accessing a file" instead of
"modifying a file" the issue would not exist. I wonder if there is a
good reason this particular wording was chosen, and - if not - would
like to see it changed. There's no reason not to strive for perfection
if it is essentially free.
Another thing is that I think the standard's way of defining a "side
effect" (by enumeration of cases) is flawed. This is a bit like defining
mammals as "primates, whales, furry animals, ... (and so on)", which
works fine until you find a platypus.
Surely, there has to be a more generic way of defining a side effect.
Best regards,
Sidney
Sidney Cadot <si****@jigsaw. nl> wrote in message news:<bu******* ***@news.tudelf t.nl>... ... But that just dismisses one of the possible 'side effects' admitted by the standard.
Does a fopen(name, "rb") count as 'calling a function that does any of those operations' ? I think it does; it /has/, at some point, to interact with the abstract machine's environment, which can only be done via volatile objects or modifying an object, eventually, somewhere down the line.
Anyway, we can pick on words (and that's valuable) but if anything, this shows that the enumeration of 'side effects' as given in the standard is not exhaustive. Clearly, opening a file (even for reading) interacts with the outside world, e.g. on unix systems it updates the 'last accessed' date as pointed out. This is not unambiguously covered by the standard; if upon literal reading we were to conclude that it isn't properly covered - well, then the standard needs to be mended on the next occasion.
The point is that the change your describing (the last accessed date)
is *not* visible to a standard C program, and an implementation could
therefore claim to be conforming even if it removed the open. I think
we'd all agree that such an implementation would have serious QoI
issues.
In article <40************ ***@yahoo.com>,
CBFalconer <cb********@yah oo.com> wrote: I think it is purely pedantic.
It is purely pedantic because no existing compiler will remove the call
to fopen ().
On the other hand: If you are a compiler writer and you want to remove
this kind of call, then you have to _prove_ that the C Standard allows
it. If you are an application programmer and you want to make sure that
the call is not removed, then you could write
volatile FILE* p = fopen ("my file", "options);
and that will make it damned hard for the compiler writer to optimise
the call away.
At any rate there is no telling what the act of opening a file involves, regardless of system. I have built systems where the act of opening a particular named file did some major re-arrangement of the entire i/o system, and the act of closing that file put it back. This kept the application proper coding standard and restricted the magic to file system drivers.
In <NL************ ********@comcas t.com> "Douglas A. Gwyn" <DA****@null.ne t> writes: Jack Klein wrote: Given your reasoning, and I see nothing to argue with, optimizing away the fopen() is a perfectly acceptable application of the as-if rule on the typical *NIX system, where opening a file leaves no trace in the system.
But that is *not* the way that Unix (POSIX) works! Opening a file *does* have side effects in the environment.
But not according to the C standard (unless you can provide a chapter and
verse). Therefore, removing the fopen() call does not affect the
implementation' s conformance to the C standard (which provides a complete
list of what it considers side effects).
Dan
--
Dan Pop
DESY Zeuthen, RZ group
Email: Da*****@ifh.de
Jack Klein wrote:
.... Doh! I probably knew that, although I haven't had anything running Linux in quite a while. It's time of creation that they don't keep separately, right?
No - seperate times are kept for the creation date, last access, and the
last modification. Da*****@cern.ch (Dan Pop) writes: In <NL************ ********@comcas t.com> "Douglas A. Gwyn" <DA****@null.ne t> writes:Jack Klein wrote: Given your reasoning, and I see nothing to argue with, optimizing away the fopen() is a perfectly acceptable application of the as-if rule on the typical *NIX system, where opening a file leaves no trace in the system.
But that is *not* the way that Unix (POSIX) works! Opening a file *does* have side effects in the environment.
But not according to the C standard (unless you can provide a chapter and verse). Therefore, removing the fopen() call does not affect the implementation' s conformance to the C standard (which provides a complete list of what it considers side effects).
Side effects include "modifying a file". In a Unix filesystem, a
directory can be treated as a file; so can the physical device
containing the filesystem.
This is admittedly stretching the point.
--
Keith Thompson (The_Other_Keit h) ks***@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <*> <http://www.sdsc.edu/~kst>
Schroedinger does Shakespeare: "To be *and* not to be" This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Ville Vainio |
last post by:
I don't know if you have seen this before, but here goes:
http://text.userlinux.com/white_paper.html
There is a jab at Python, though, mentioning that Ruby is more
"refined".
--
Ville Vainio http://www.students.tut.fi/~vainio24
|
by: Marco Bubke |
last post by:
Hi
I have read some mail on the dev mailing list about PEP 318 and find the new
Syntax really ugly.
def foo(x, y): pass
I call this foo(1, 2), this isn't really intuitive to me!
Also I don't like the brackets.
|
by: Jase |
last post by:
For some reason all of a sudden "£" signs are displaying as "?" when the
field is displayed.
The display code is:
<%=rs.Fields("WagesText")%>
This was working fine before, so I have no idea why it has suddenly changed.
The code hasn't altered as far as I'm aware but it is a possibility. The
database is SQL based.
|
by: Curious Angel |
last post by:
I have a resume in PDF format and I want anyone who LEFT-OR-RIGHT clicks the link to
force the file to be saved, and in any event _not_ opened.
Since the PDF will be in his cache in any event, I would just as soon place the
employer in control of what directory he wishes to save it in, and there are two
salient reasons for this:
1. I want him to OWN the document
2. I want him to FIND the document, quickly, on his hard drive
In any...
|
by: Daniel |
last post by:
how to make sure a xsl document has valid xsl syntax? i tried loading it
into an xml document but that doesnt show syntax errors inside attributes
such as "foo/bar" vs "bar\foo"
| |
by: Petr Jakes |
last post by:
Hi,
I am trying to set-up communication to the coin change-giver from my
Linux box using the Python code. The change giver uses MDB (Multi Drop
Bus) serial protocol to communicate with the master. MDB protocol is
the 9bit serial protocol:
(TX, RX lines only) 9600bps, 9bits, No Parity, 1 Start, 1 Stop.
I would like to control the UART "parity bit" to try to simulate 9bit
communication.
|
by: Paminu |
last post by:
In math this expression:
(a < b) && (b < c)
would be described as:
a < b < c
But why is it that in C these two expressions evaluate to something
different for the same values of a, b and c?
|
by: ZSP747 |
last post by:
Now,I prepare to write a English-Chinese dictionary.
So I want find a function or library can convert the words from one
form to another,such as "boys"->"boy","became->become","went"->"go".
Because there is so many unregular convertions in English then I think
it will be a hard work if do it by myself.
Thanks.
|
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: 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: 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: 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 instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
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: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |