SIGSEGV problem z detekcja

Odpowiedz Nowy wątek
2019-08-23 12:25
0

Witam, mam problem SIGSEGV, jednak uzywam QT Creatora i nie wiem jak go tutaj znalezc, bo nie wyskakuje mi, dopiero jak uploaduje program do testowania to sie wyswietla, moglby ktos pomoc mi w QT Creatorze ogarnac zebym mogl wykrywac? (Jest valgrind i Memcheck jakis ale nic sie nie dzieje jak klikne (screen)) Albo rozkminic co zle napisalem? Z gory dziekuje

Witam, mam problem bo wyskakuje mi SIGSEGV w testach, uzywalem QT Creator i nie mam pojecia co zrobic zeby w debugowaniu znajdowal mi te bledy.
Problem pojawia sie w tutaj. Mógłaby jakas dobra dusza pomoc?

int reverse_vector(int* tab, int size)
{
    if(tab == NULL || size <= 0) return 1;
    int temp;
    for(int i = 0; i < size/2; i++)
    {
        temp = *(tab + size - i - 1);
        *(tab + size - i - 1) = *(tab + i);
        *(tab + i) = temp;
    }
    return 0;
}

void display_vector(const int* tab, int size)
{
    for(int i=0; i<size; i++)
    {
        printf("%d ", *(tab+i));           <---------------- tutaj pokazuje blad SIGSEGV
    }
}

main :

    int tab1[100], tab2[100];
    int *vec = tab1, *vec2 = tab2;

    printf("Podaj liczby: ");
    int size = read_vector(vec, 100, 0);

    int wynik = reverse_vector(vec, size);

    display_vector(vec2, size);
    printf("\n");
    display_vector(vec, size);

Kolejny SIGSEGV w programie o Histogramie mam,
tylko tutaj mi nie pokazuje w ktorej lini jest zle :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "vector_utils.h"

int read_vector_float(float *vec, int size, float stop_value)
{
    if(vec == NULL || size <= 0 ) return -1;
    int sizeD = 0;
    float temp;

    for(int i=0; i<size; i++)
    {
        if(scanf("%f", &temp) != 1)
        {
            return -1;
        }
        if(temp == 0)
        {
            return 0;
        }
        sizeD++;
        if(temp == stop_value)
        {
            sizeD--;
            break;
        }
        *(vec + i) = temp;
    }
    return sizeD;
}

int create_histogram(const float *vec, int size, int *out, int out_size)
{
    if(vec == NULL || size <= 0 || out == NULL || out_size <= 0) return 1;

    for(int i = 0; i < 100; i++)
    {
        *(out + i) = 0;
    }

    for(int j = 0; j < size; j++)
    {
        float a = 0, c = 0, b = 1;
        a = *(vec + j);

        for(int i = 0; i < out_size; i++)
        {
            if( a >= c && a < b )
            {
                *(out + (int)c) += 1;
            }
            c++;
            b++;
        }

    }
    return 0;
}

void display_vector(const int* tab, int size)
{
    int i;
    for(i=0; i<size; i++)
    {
        printf("%d ", *(tab+i));
    }
}

main :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "vector_utils.h"

int main()
{
    float tab1[100];
    float *vec = tab1;

    int tab2[100];
    int *out = tab2;
    int size = 0;

    printf("Podaj liczby:\n");

    size = read_vector_float(vec, 100, -1);

    int hist = create_histogram(vec, size, out, 11);

    display_vector(out, 11);
}

title
https://ibb.co/L9tDc7K ---- screen

edytowany 3x, ostatnio: kq, 2019-08-23 12:51

Pozostało 580 znaków

2019-08-23 12:51
kq
0

Ciężko z pewnością odpowiedzieć na pytanie nie widząc całego kodu.

    display_vector(vec2, size);

To jest na pewno źle, bo nigdzie nie inicjalizujesz tab2, więc masz UB. Chociaż to powinno wyświetlić śmieci, a nie powodować SIGSEGV


Pozostało 580 znaków

2019-08-23 12:53
0

https://www.ibm.com/developer[...]d_by_valgrind_part_i8?lang=en


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

2019-08-23 12:58
0
void display_vector(const int* tab, int size)
{
    for(int i=0; i<size; i++)
    {
        printf("%d ", *(tab+i));           <---------------- tutaj pokazuje blad SIGSEGV
    }
}

@simonsoft W której iteracji leci Ci sigsev? Tak jak napisał @KrzaQ powinieneś mieć śmieci a nie sigsev dopóty trzymasz się prawidłowego rozmiaru. Jeżeli read_vector zwraca Ci nie prawidłowy (za duży) rozmiar to faktycznie możesz się nadziać na sigsev.

Pozostało 580 znaków

2019-08-23 12:59
0

Main z histogramu


#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"

int main()
{
    int tab1[100], tab2[100];
    int *vec = tab1, *vec2 = tab2;

    printf("Podaj liczby: ");
    int size = read_vector(vec, 100, 0);
    if(size == -1)
    {
        printf("Incorrect input");
        exit(1);
    }
    if(size == 0)
    {
        printf("Not enough data available");
        exit(3);
    }

    for(int i = 0; i < size; i++)
    {
        *(vec2 + i) = *(vec + i);
    }

    int wynik = reverse_vector(vec, size);

    if(wynik == 1)
    {
        printf("Incorrect input");
        exit(1);
    }

    display_vector(vec2, size);
    printf("\n");
    display_vector(vec, size);

    return 0;
}
edytowany 1x, ostatnio: simonsoft, 2019-08-23 13:00

Pozostało 580 znaków

2019-08-23 13:01
kq
0

Pokaż jeszcze read_vector(). Kod na pierwszy rzut oka wydaje się poprawny, choć ma dziwną skłonność do stosowania nieczytelnej arytmetyki na wskaźnikach zamiast notacji tablicowej.


Pozostało 580 znaków

2019-08-23 13:23
0
kq napisał(a):

Pokaż jeszcze read_vector(). Kod na pierwszy rzut oka wydaje się poprawny, choć ma dziwną skłonność do stosowania nieczytelnej arytmetyki na wskaźnikach zamiast notacji tablicowej.

int read_vector(int* tab, int size, int stop_value)
{
    if(tab == NULL || size <= 0 ) return -1;
    int sizeD = 0;

    while (sizeD < size)
    {
        int read = scanf("%d", &(*(tab + sizeD)));
        if ((read <= 0)) return -1;
        if (read != 1 || *(tab+sizeD) == stop_value) break;
        ++sizeD;
    }
    return sizeD;
}
edytowany 2x, ostatnio: simonsoft, 2019-08-23 13:23

Pozostało 580 znaków

2019-08-23 13:31
0
several napisał(a):
void display_vector(const int* tab, int size)
{
    for(int i=0; i<size; i++)
    {
        printf("%d ", *(tab+i));           <---------------- tutaj pokazuje blad SIGSEGV
    }
}

@simonsoft W której iteracji leci Ci sigsev? Tak jak napisał @KrzaQ powinieneś mieć śmieci a nie sigsev dopóty trzymasz się prawidłowego rozmiaru. Jeżeli read_vector zwraca Ci nie prawidłowy (za duży) rozmiar to faktycznie możesz się nadziać na sigsev.

No wlasnie wpienia mnie to, ze w kompilatorze u mnie normalnie dziala, a dopiero w testach sie wywala, chcialbym zeby w kompilatorze mi pokazywalo, uzywal ktos QT Creatora ?

Pozostało 580 znaków

2019-08-23 13:35
kq
0

Qt Creator to moje podstawowe IDE do C++ :​)

Masz dostęp do danych testowych? Nie odpalałem, ale ten kod wygląda dobrze. Zamiast bawić się z valgrindem, odpal memory sanitizera (-lasan do linkera, -fsanitize=address do kompilatora) i zobacz czy nie narzeka dla przypadków skrajnych - 100, 101 elementów itd.


Pozostało 580 znaków

2019-08-23 13:44
0
kq napisał(a):

Qt Creator to moje podstawowe IDE do C++ :​)

Masz dostęp do danych testowych? Nie odpalałem, ale ten kod wygląda dobrze. Zamiast bawić się z valgrindem, odpal memory sanitizera (-lasan do linkera, -fsanitize=address do kompilatora) i zobacz czy nie narzeka dla przypadków skrajnych - 100, 101 elementów itd.

Gdzie to sie wpisuje? Nie mam podane w ktorej iteracji SIGSEGV leci

edytowany 1x, ostatnio: simonsoft, 2019-08-23 13:45

Pozostało 580 znaków

2019-08-23 13:55
kq
0
QMAKE_CFLAGS += -fsanitize=address
LIBS += -lasan

W pliku .pro.


edytowany 1x, ostatnio: kq, 2019-08-23 13:56

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot