C. To segmentation fault or not to segmentation fault, that is the question.


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
# 1  
C. To segmentation fault or not to segmentation fault, that is the question.

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! This will NOT even compile on gcc 2.95.3 for the AMIGA, but WORKS correctly on OSX 10.14.1, gcc 4.2.1.
Code:
/* No_error gcc 4.2.1 demo. */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int NUM_1;
int NUM_2;
char CHARACTER;

int main(int argc, char *argv[])
{
    /* Conditional BEFORE _variables_! */
    if (argc <= 3)
    {
        printf("ERROR!\n\n");
        printf("Not enough arguments!\n");
        exit(1);
    }

    int NUM_1 = strtod(argv[1], NULL);
    int NUM_2 = strtod(argv[3], NULL);
    CHARACTER = *argv[2];

    printf("\n%i, %i, %c\n\n", NUM_1, NUM_2, CHARACTER);

    return(0);
}


/* ****************************************
     Results OSX 10.14.1, gcc 4.2.1...

Last login: Fri Mar 15 14:45:03 on ttys000
AMIGA:amiga~> cd Desktop/Code/C
AMIGA:amiga~/Desktop/Code/C> gcc noerror.c
AMIGA:amiga~/Desktop/Code/C> ./a.out
ERROR!

Not enough arguments!
AMIGA:amiga~/Desktop/Code/C> ./a.out 1 v
ERROR!

Not enough arguments!
AMIGA:amiga~/Desktop/Code/C> ./a.out 1 v 3

1, 3, v

AMIGA:amiga~/Desktop/Code/C> _

**************************************** */

ALSO IMPORTANT! This compiles and WORKS perfectly on the AMIGA but gives a segmentation fault on OSX 10.14.1, gcc 4.2.1.
Code:
/* Error gcc 4.2.1 demo. */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int NUM_1;
int NUM_2;
char CHARACTER;

int main(int argc, char *argv[])
{
    int NUM_1 = strtod(argv[1], NULL);
    int NUM_2 = strtod(argv[3], NULL);
    CHARACTER = *argv[2];

    /* Conditional AFTER _variables_! */
    if (argc <= 3)
    {
        printf("ERROR!\n\n");
        printf("Not enough arguments!\n");
        exit(1);
    }

    printf("\n%i, %i, %c\n\n", NUM_1, NUM_2, CHARACTER);

    return(0);
}

/* ****************************************

Last login: Fri Mar 15 15:48:37 on ttys000
AMIGA:amiga~> cd Desktop/Code/C
AMIGA:amiga~/Desktop/Code/C> gcc error.c
AMIGA:amiga~/Desktop/Code/C> ./a.out
Segmentation fault: 11
AMIGA:amiga~/Desktop/Code/C> ./a.out 1 r
Segmentation fault: 11
AMIGA:amiga~/Desktop/Code/C> ./a.out 1 r 6

1, 6, r

AMIGA:amiga~/Desktop/Code/C> _

**************************************** */

As you can see the second code gives a Segmentation fault: 11 on OSX 10.14.1, gcc 4.2.1 but compiles and works correctly on the AMIGA.

Can anyone explain why there is a SEGMENTATION FAULT when the if conditional statement is inside the 'main()' function to start with and the assignments set?
# 2  
Hi,
Both systems are 64 bit?
Maybe this is due to the red zone in the stack?

--- Post updated at 19:55 ---

Or maybe on the second system the usual garbage enters this area of the stack?
# 3  
Hi nezabudk...

64 bit?
No, AMIGA A1200 is Motorola 68020 CPU 32 bit, newest gcc 2.95.3.
Yes, APPLE MBP is Intel 64 bit, newest gcc 4.2.1.

argc is _defined_ as an integer in the 'main()' function.
As for the stack quite possibly, but why? I am only comparing and argc integer against a fixed number.
Why should ANY assignments BEFORE the unrelated conditional statement crash out on this MBP?

There is little or nothing on the web about it?
And it compiles and works on the ancient gcc 2.95.3 for the equally ancient AMIGA A1200.
# 4  
I understood correctly?
On a 64-bit system without parameters, the code gives "Segmentation fault".
Is there no " Segmentation fault" on the 32-bit system when started without parameters?

If my assumptions are correct, when creating a stack in the "main" function of the 64-bit system, a layer in the form of a red zone from the previous stack is filled with machine zeros and the parameters get no value, which leads to segmentation. And when creating a frame in the 32-bit system of this red zone is not! And the garbage from the old frame gets into the parameters and therefore there is no segmentation. But this is still not correct.

P.S. Thanks "Auto Save Recovery" accidentally closed the tab.

--- Post updated at 21:03 ---

I apologize this line should be read like this
Quote:
Is there no " Segmentation fault" on the 32-bit system when started without parameters?
There is no " Segmentation fault" on the 32-bit system when started without parameters

Last edited by nezabudka; 03-15-2019 at 03:54 PM..
# 5  
It crashes when you overrun the end of argv[].

Code:
int main(int argc, char *argv[])
{
    int NUM_1 = strtod(argv[1], NULL); // Does argv[1] exist?  If not, crash.
    int NUM_2 = strtod(argv[3], NULL); // Does argv[3] exist?  If not, crash.
    CHARACTER = *argv[2]; // Does argv[2] exist?  If not, crash.

    /* Conditional AFTER _variables_! */
    if (argc <= 3)
    {
        printf("ERROR!\n\n");
        printf("Not enough arguments!\n");
        exit(1);
    }

    printf("\n%i, %i, %c\n\n", NUM_1, NUM_2, CHARACTER);

    return(0);
}

The system is actually supposed to crash when you do this, rather than let you get away with mangling data outside of bounds, but some systems are better at catching it than others.
This User Gave Thanks to Corona688 For This Post:
# 6  
@nez...

(Just seen Corona688 post.)

The code was written for a real stock A1200 with HDD, Motorola 68020 32 bit, no FPU nor MMU.
This is a screenshot of the FS-UAE AMIGA emulator for THIS 64 bit MBP, OSX 10.14.1, using 68040 with FPU and MMU, and much more than the stock 2MB RAM, compiling the 'error.c' code that is in the OP using the AMIGA's gcc 2.95.3.

As you can see it IS working!

EDIT:
@C688...

That makes sense but I didn't see it. However the OP's first code block will not compile in gcc 2.95.3 as it crashes out so I am stuck with an 'illegal' operation for my fav' OS.
C. To segmentation fault or not to segmentation fault, that is the question.-68040_fpu_mmupng

Last edited by wisecracker; 03-15-2019 at 04:46 PM.. Reason: See EDIT.
This User Gave Thanks to wisecracker For This Post:
# 7  
Working by sheer coincidence. Going beyond the end of the array means you can't predict what data you'll find there. To avoid out of bounds errors, stay in bounds.

And now the way you're supposed to do it:

Code:
int main(int argc, char *argv[])
{
    int NUM_1, NUM_2, CHARACTER;

    if (argc <= 3)
    {
        printf("ERROR!\n\n");
        printf("Not enough arguments!\n");
        exit(1);
    }
    NUM_1 = strtod(argv[1], NULL);
    NUM_2 = strtod(argv[3], NULL);
    CHARACTER=*argv[2];
    printf("\n%i, %i, %c\n\n", NUM_1, NUM_2, CHARACTER);

    return(0);
}

Should work on older compilers.
This User Gave Thanks to Corona688 For This Post:
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #464
Difficulty: Medium
chrony was developed and written in Python.
True or False?

10 More Discussions You Might Find Interesting

1. Solaris

Segmentation fault

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)
Discussion started by: cjashu
2 Replies

2. Programming

Using gdb, ignore beginning segmentation fault until reproduce environment segmentation fault

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)
Discussion started by: pooyair
6 Replies

3. UNIX for Advanced & Expert Users

segmentation fault with ps

What does this mean and why is this happening? $ ps -ef | grep ocular Segmentation fault (core dumped) $ ps -ef | grep ocular Segmentation fault (core dumped) $ ps aux | grep ocular Segmentation fault (core dumped) $ ps Segmentation fault (core dumped) $ pkill okular $ ps... (1 Reply)
Discussion started by: cokedude
1 Replies

4. Programming

segmentation fault

What is segmentation fault(core dumped) (1 Reply)
Discussion started by: gokult
1 Replies

5. Programming

segmentation fault

If I do this. Assume struct life { char *nolife; } struct life **life; // malloc initialization & everything if(life->nolife == 0) Would I get error at life->nolife if it is equal to 0. wrong accession? (3 Replies)
Discussion started by: joey
3 Replies

6. Programming

segmentation fault

ive written my code in C for implementation of a simple lexical analyser using singly linked list hence am making use of dynamic allocation,but when run in linux it gives a segmentation fault is it cause of the malloc function that ive made use of????any suggestions as to what i could do??? thank... (8 Replies)
Discussion started by: rockgal
8 Replies

7. Programming

Hi! segmentation fault

I have written a program which takes a directory as command line arguments and displays all the dir and files in it. I don't know why I have a problem with the /etc directory.It displays all the directories and files untill it reaches a sub directory called peers which is in /etc/ppp/peers.the... (4 Replies)
Discussion started by: vijlak
4 Replies

8. UNIX for Dummies Questions & Answers

Segmentation Fault

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)
Discussion started by: compbug
3 Replies

9. AIX

Segmentation fault

I am tring to install Lotus Domino/Notes 5.0.5 on a AIX 4.3.3 server. I go to run the cdrom/ibmpow/install and I get the following error. Lotus Notes for Unix Install Program --------------------------------------------- ./install: 10088 Segmentation fault This had Lotus Notes installed... (1 Reply)
Discussion started by: jshaulis
1 Replies

10. Programming

segmentation fault

hi all i'm trying to execute a c program under linux RH and it gives me segmentation fault, this program was running under unix at&t anybody kow what the problem could be? thanx in advance regards (2 Replies)
Discussion started by: omran
2 Replies

Featured Tech Videos