El 11/04/2010 9:41, Philip Guenther escribis:
On Sat, Apr 10, 2010 at 10:14 PM, Jesus Sanchez<zexe...@gmail.com>  wrote:
El 11/04/2010 6:14, Jesus Sanchez escribis:
...
   Coding some simple stuff in C I ended up having a harmless mistake (I
hope) a double-declared variable with different types (char and int for
the example) in wich I did assignements beyond the bounds of the type
size. Let's call it foo, declared in files compiled separatedly. Also
say that everything it's compiled with gcc -c option (exect the final
executable) without warnings of any kind:

   file a.c  contains "char foo" on the code.
   and b.c  contains "int foo" on the code.
It violates a constraint of the C standard for two translation units
of a program to have different tentative definitions for a single
(necessarily external) identifier.  Therefore, the behavior of your
program is NOT DEFINED BY THE C STANDARD.

If you're interested in the chapter-and-verse of this, I suggest you
take it to USENET, comp.lang.c


   I know the rigth thing is to declare the variable 'foo' on a header
file and include it in all my code but I was just curious, what happends
to the upper 0x22 ?? Was I accessing to a ilegal zone of memory?? the
code executed without any error :o and the compiler showed no warning.
You were doing something that isn't guaranteed by the standard and
whose behavior isn't guaranteed by OpenBSD.  If you ever upgrade your
system or try to compile this software on other systems, it may behave
differently WITH NO WARNING.

Given that, writing such code seems...unwise.  I certainly recommend
against doing so.


...
When using ELF, the .comm directive takes an optional third argument. This
is the desired alignment of the symbol, specified as a byte boundary (for
example, an alignment of 16 means that the least significant 4 bits of the
address should be zero). The alignment must be an absolute expression, and
it must be a power of two. If ld allocates uninitialized memory for the
common symbol, it will use the alignment when placing the symbol. If no
alignment is specified, as will set the alignment to the largest power of
two less than or equal to the size of the symbol, up to a maximum of 16.

seen on:
http://stackoverflow.com/questions/501105/gcc-generated-assembly-comm
<sigh>

1) alignment != allocated size.  A one byte variable might have 4 byte
alignment...and yet still share space with another variable with a
less strict alignment!

2) To steal a quote from Blair Houghton: "'I read it on a random web
site' that's sort of like hearsay evidence from Richard Nixon..."
You've quoted a website; do you have a *good* reason for believing
that their quote applies to (1) the software you're running, or (2)
the software you will be running in the future?

Of course it's a bad practice to believe an internet quote without
looking by yourself on official sources, it was a quick way to obtain
a clue to search on google (.comm , different alignement and sizes, etc).


so regarding my question, ld will use the largest memory space found as a
.comm foo,
  so no harm at all with this mistake :D
The only harm is to your reputation as a C programmer.  For example, I
would not hire a programmer who said "it's okay to have conflicting
variable definitions in different translation units".

Well as I intended to say on my original email, this was just followed because curiosity, as I found out I put everything in the right way. I'm still a student so of course there are still many things I don't know, thats why it's important to
me to try things out of production and learn from experienced people beyond
reading theory books all by myself.

With your mail you gave me lots of things to look on internet and
search them by myself  to understand this, reading official documentation,
thats why I really apreciate this wise words.

Thanks for your time and advice.
-J

Reply via email to