Why does this example C code run and yet SHOULD either not compile or give a segmentation fault?
Apologies for any typos...
Well guys, been researching 'goto' in C and they say that you can't 'goto' labels in another function as a segmentation fault will occur.
However I have found a way to 'goto' a label in another function that is NOT main() using the asm() function.
As you know I love doing things with languages that they were not designed to do.
This works on gcc 2.95.3, gcc 4.2.1 and gcc 7.3.0. AMIGA OS 3.0.x using ADE, OSX 10.14.3 and Linux Mint 19.
Although I am aware of what is happening, what I don't understand is why gcc and/or its assembler, (? 'as' ?), up to at least version 7.3.0 does not give a warning or error report and NOT allow compilation.
I don't have the current gcc which I think is version 8.2.0 so it might have been found now.
Results on OSX 10.14.3, default bash terminal, gcc 4.2.1.
The important bit is this:
From main(), test1() is called which returns via the test2() function and from reading the hexdump...
The "nop"s, ([0x]90), are only there for easy detection inside the hexdump...
So starting at the end of the first 'nop' in function test1() the first instruction is a 32 bit jump of length 43, ([0x]2b), bytes.
So at byte position '00000ec9' we get: e9 2b 00 00 00 which brings you inside the second function 'nop' located at byte position '00000ee8' ready to execute the next 'nop' instruction.
And from then runs the second function which prints a string, the string in test1() is ignored.
My C days are long gone, and assembler even longer, so I don't have any authority to speak up, but to me it seems clear and logical that no strange behaviour e.g. "segmentation fault" comes up with your above code. One reason amongst others for segmentation faults is stack corruption, which may occur if a function is not left (and tidied up) correctly. But, in above example, the two functions have the same parameter / argument structure (none, to be specific), and identical local variable definitions (namely none), so the (quite complex, generated internally by the compiler) return operation includes the same stack tidying up, resulting in test2() 's return statement leaving behind a clean stack although geared up by test1().
What if you specify a large argument list for one of the functions, and define several local variables? Pls try and report back.
Aside: I'm afraid you're slightly off with your hex locations. The first jump takes off from location 0xEBE, and it lands on 0xEE9, right between the two NOPs, which is exactly where the label definition occurred.
This is basically another way to do the undefined operation thing.
asm:
Not part of standard C, so whatever asm does is implementation defined, i.e., the people who wrote gcc
Since it's not mentioned in ISO C standard (n1570 draft-- C2011), but mentioned in annex J (common extensions):
Quote:
J.5.10 The asm keyword
1 The asm keyword may be used to insert assembly language directly into the translator output (6.8). The most common implementation is via a statement of the form:
asm ( character-string-literal );
Annex J is informative, not normative, so an implementation need not provide inline assembly, and if it does it's not prescribed in which form. But it's a widespread extension, though not portable since compilers do indeed implement it differently.
In the C++ standard (n3376 draft of the C++11 standard), it is NOT mentioned in the body of the standard.
Quote:
7.4 The asm declaration [dcl.asm]
1 An asm declaration has the form
asm-definition:
asm ( string-literal ) ;
The asm declaration is conditionally-supported; its meaning is implementation-defined. [ Note: Typically it is used to pass information through the implementation to an assembler. - end note ]
I think Rudi correct. Try using return statements. That return values used by the calling code. Other than learning what not to do for reasonable code, what does this do for you? If you had not asked here your might have accidentally created a horrible bug in a piece of code that you thought was okay. It's okay with me, but it does not seem all that helpful....
Last edited by jim mcnamara; 03-28-2019 at 12:06 PM..
This User Gave Thanks to jim mcnamara For This Post:
Hi,
I do not quite understand what the problem is. But a walk in the GDB will not be amiss
I always create a file cat sc
Open next terminal
Return to the first and run GDB
And go through the program
maybe this will helpful
Thanks Jim...
I only attempted it to see if it was possible, and it DOES give a segmentation fault IF and only IF the 'jmp' goes directly into main() .
BUT it still compiles...
I created this absolute meaningless garbage and it compiles without warnings and errors and look what happens:
Results on OSX 10.14.3, default bash terminal, gcc 4.2.1.
(IMPORTANT! NOT checked on gcc 2.95.2 or 7.3.0.) 7 ./cross_function_jump is obviously wrong but I have successfully got 'argv[0]'.
I don't care what is happening but compiling AND running without a segmentation fault is is not a fault of the programmer but of the compiler.
Any 'asm()' whether part of compliance or not code should never be allowed to jump out of its own function domain and this was my point entirely.
What I have done I would never use in practice but I would use inline assembly for mission critical stuff inside its own function.
All I wanted to know why these compile and run, garbage results or not.
Why should your first program crash? You're not touching any memory you shouldn't, and one "ret" is as good as another as long as you've got the same size stack context, which you do to the last byte.
7 ./cross_function_jump is obviously wrong but I have successfully got 'argv[0]'.
Because argv[0] actually exists, even in a program with no arguments - it's the name of the calling program.
Quote:
I don't care what is happening but compiling AND running without a segmentation fault is is not a fault of the programmer but of the compiler.
Again, why should it segfault? What exact fault should it be catching here? Segmentation fault means "touched memory I don't have permission to use", and if you don't do that, you don't get a segfault, even if you leap around like a flea on a hot griddle.
Oddities with gcc, 2.95.3 for the AMIGA and 4.2.1 for MY current OSX 10.14.1...
I am creating a basic calculator for the AMIGA ADE *NIX emulator in C as it does not have one.
Below are two very condensed snippets of which I have added the results inside the each code section.
IMPORTANT!... (11 Replies)
Hi Guys,
I just installed and booted a zone called testzone. When I logged in remotely and tried changing to root user I get this error:
"Segmentation fault"
Can someone please help me resolve this?
Thanks alot (2 Replies)
I use a binary name (ie polo) it gets some parameter , so for debugging normally i do this :
i wrote script for watchdog my app (polo) and check every second if it's not running then start it , the problem is , if my app , remain in state of segmentation fault for a while (ie 15 ... (6 Replies)
Hi Friends,
I have written a small code in C which performs the below operations
Task : 1 ) read line by line from a file.
2 ) assuming 3th and 4th fields of the file as GN and GNTO
3 ) The target file should contain all the fields except GNTO.
4... (3 Replies)
I'm getting a segmentation fault. I'm new to Linux programming. Thanks so much for all of your input.:eek:
#include </usr/include/mysql++/mysql++.h>
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <string.h>
using namespace std;
int outputToImport(const char*... (1 Reply)
The java program is a part of speech tagger -> The Stanford NLP (Natural Language Processing) Group
The goal is to use this script as part of a webpage to tag parts of speech based on a user-inputted string.
I have no idea what to do with the files - I'm a complete *nix noob. I tried running... (4 Replies)
Hello,
I am running on a AIX5.2 server with Oracle 10g and 9i. My code compiles and works fine in 32-bit mode. The
same code compiles in 64-bit and runs good. The program catches CNTRL-C signal to terminate. Only on 64-bit code
when i hit CNTRL-C, the program exits with segmentation... (0 Replies)
hello all,
I tried a program on an array to intialise array elements from the standard input device.it is an integer array of 5 elements.but after entering the 4th element it throws a message called "Segmentation Fault" and returns to the command prompt without asking for the 5th element.
... (3 Replies)