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


 
Thread Tools Search this Thread
Top Forums Programming C. To segmentation fault or not to segmentation fault, that is the question.
# 1  
Old 03-15-2019
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  
Old 03-15-2019
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  
Old 03-15-2019
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  
Old 03-15-2019
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 02:54 PM..
# 5  
Old 03-15-2019
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  
Old 03-15-2019
@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 03:46 PM.. Reason: See EDIT.
This User Gave Thanks to wisecracker For This Post:
# 7  
Old 03-15-2019
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 to Ask a Question

Previous Thread | Next Thread

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. Homework & Coursework Questions

Segmentation Fault

this is a network programming code to run a rock paper scissors in a client and server. I completed it and it was working without any error. After I added the findWinner function to the server code it starts giving me segmentation fault. -the segmentation fault is fixed Current problem -Also... (3 Replies)
Discussion started by: femchi
3 Replies

3. 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

4. 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

5. Programming

Segmentation fault in C

i have this code int already_there(char *client_names, char *username) { int i; for(i = 0; i<NUM; i++) { printf("HERE\n"); if (strcmp(client_names, username)==0) return(1); } return(0); } and i get a segmentation fault, whats wrong here? (7 Replies)
Discussion started by: omega666
7 Replies

6. Programming

Segmentation fault.

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)
Discussion started by: sepoto
1 Replies

7. 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

8. Linux

Segmentation fault

Hi, on a linux Red HAT(with Oracle DB 9.2.0.7) I have following error : RMAN> delete obsolete; RMAN retention policy will be applied to the command RMAN retention policy is set to redundancy 2 using channel ORA_DISK_1 Segmentation fault What does it mean ? And the solution ? Many thanks. (0 Replies)
Discussion started by: big123456
0 Replies

9. AIX

Segmentation fault

Hi , During execution a backup binary i get following error "Program error 11 (Segmentation fault), saving core file in '/usr/datatools" Riyaz (2 Replies)
Discussion started by: rshaikh
2 Replies

10. Programming

segmentation fault

sometimes for this code i get a segmentation fault for codes llike this : int main{ int * a= 0; int b; a = (int*)malloc(sizeof(int)); ///some code using these variable but no freeing of a if(a){ free(a); a = 0; } return... (3 Replies)
Discussion started by: wojtyla
3 Replies
Login or Register to Ask a Question