SIGSEGV problem z detekcja

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

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

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.

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;
}

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.

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;
}
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 ?

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.

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

0
QMAKE_CFLAGS += -fsanitize=address
LIBS += -lasan

W pliku .pro.

0
kq napisał(a):
QMAKE_CFLAGS += -fsanitize=address
LIBS += -lasan

W pliku .pro.

I potem odpalic debuggera i cos wyskoczy w razie czego czy jak?

0

Do kodu wynikowego zostanie dodana odpowiednia instrumentacja i w razie problemów zostanie wypisane odpowiednie info na stderr.

0
kq napisał(a):

Do kodu wynikowego zostanie dodana odpowiednia instrumentacja i w razie problemów zostanie wypisane odpowiednie info na stderr.

teraz dostaje komunikat

cannot find -lasan
collect2.exe:-1: błąd: error: ld returned 1 exit status
0

Kompiluj na linuksie, będzie Ci dużo łatwiej. Na windowsie chyba nie ma równie łatwo dostępnych podobnych narzędzi.

0
kq napisał(a):

Kompiluj na linuksie, będzie Ci dużo łatwiej. Na windowsie chyba nie ma równie łatwo dostępnych podobnych narzędzi.

nie mam linuksa teraz, da rade to cofnac jakos bo jak usunalem to -lasan itp to nadal nie dziala i sa jakies bledy

title

0

Usuń oba wpisy i tyle. Postawienie maszyny wirtualnej to chwila.

0
kq napisał(a):

Usuń oba wpisy i tyle. Postawienie maszyny wirtualnej to chwila.

usunalem i wlasnie takie bledy sie wyswietlily jak na screenie

0

Usuń oba wpisy, nie tylko -lasan

0
kq napisał(a):

Usuń oba wpisy, nie tylko -lasan

usunalem oba wpisy wlasnie i to samo =/

0

pokaż plik .pro.

Poza tym, sprawdź czy nie masz śmieci - odpal qmake jeszcze raz i przebuduj ponownie.

0

zrobilem nowy projekt. Niewazne, prosze pomoz mi to ogarnac bo nie moge znalezc gdzie mam ten SIGSEGV, jak to zrobic zeby wykrywalo go

0

A probowales tego valgrinda?

0
stivens napisał(a):

A probowales tego valgrinda?

Nie wiem jak go uzywac, jak klikam tam jak na screenie to nic sie nie dzieje. Pomozesz mi to ogarnac?
Jak klikniesz na link to bedzie strzalka czerwona, dziwne ze tutaj nie pokazuje jej
https://imgur.com/RmpKfJ5

0

szukam ale nigdzie nie ma skad pobrac, pobralem jakis plik .tar i co teraz instaluje to w QT Creatorze?

0

Ten .tar to na linuxa

Tak sobie uswiadomilem ze valgrinda na windowsa moze nie byc

Edit: https://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows

0
stivens napisał(a):

Ten .tar to na linuxa

Tak sobie uswiadomilem ze valgrinda na windowsa moze nie byc

Edit: https://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows

Jakis ziomek tam pisze o 1. Memcheck i 2. Callgrind, to moze ktores z nich zainstaluje co myslisz?

Znaczy Dr.Memory i VerySleepy

0

Probuj probuj

0

a moglbys u siebie zobaczyc gdzie to wywala?

0

Jakbys wrzucil archiwum z projektem to moze wieczorem. Ale szybciej bedzie samemu ogarnac (i nauczyc sie nowego narzedzia) niz czekac do 21/22

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