UndefinedBehaviorSanitizer из-за нулевого указателя - PullRequest
0 голосов
/ 06 ноября 2019

Привет, у меня есть код на C, который не работает. Я просто пытаюсь получить цену от картофеля typedef до моей выездной функции. Я "//" код, который не используется. Если вам нужна дополнительная информация, пожалуйста, просто спросите, хотя я понятия не имею, как решить эту проблему. Поэтому любая помощь очень ценится.

 #include <stdio.h>
 #include <string.h>   

    int number;

    void get_number ( );
    void show_menu ( );
    int get_input ( );
    void chech_out ();

    struct Product 
    {
            float potatoes;
    };
    typedef struct Product product;

    int main (void)
    {
        struct Product product;

        while (1)
        {
            //show_product1 ();
            show_menu ();
            if (get_input ()) // end on "a"
                break;
        }
        printf ("Bye!");
        return 0;
    }



    void show_menu (void)
    {
        printf ("Type what you wanne do");
        printf ("f)change amount    h)chech out    s)Strawberry");
        printf ("c)carrots    p)potatoes  o)Onion");
        printf ("a)quit");
    }

    void get_number ( )
    {

        printf ("Enter number in kg: ");
        scanf ("%d", &number);
    }



    int get_input (struct Product *product )
    {
        char letter;

        scanf ("%c", &letter);
        switch (letter)
        {
            case 'f':
                printf("\n\n\nWhenever you enter a new amount it will reset the old one!\n\n");

                break;
            case 'h':
                chech_out();


                break;
            case 'c':

                break;
            case 'p':


                get_number();           
                float P_freightPrice = number*12;
                float P_kgPrice = number*25;
                float P_totalprice=P_freightPrice+P_kgPrice;
                product->potatoes = P_totalprice;
           printf("\n%f\n",P_totalprice);     

         if (P_totalprice <= 100)
         {
           printf("%f\n",P_totalprice);    
         }
         if (P_totalprice>=101 && number<=350)
         {
             float New=(P_totalprice/100)*5;
             float total=P_totalprice-New;
             printf("%f\n",total);    
         }
         if(P_totalprice>=351 && P_totalprice<=600)
         {
             float New=(P_totalprice/100)*10;
             float total=P_totalprice-New;
             printf("%f\n",total); 

         }
        if(P_totalprice>=601)
        {
             float New=(P_totalprice/100)*15;
             float total=P_totalprice-New;
             printf("%f\n",total);    
        }  

                break;
            case 'a':
                return 1;
            default:
                ;
        }
        return 0;
    }

    void chech_out (struct Product *product)
    {
        printf("%2.f",product->potatoes);
    }

Я получаю сообщение об ошибке:

hj4.c:181:28: runtime error: member access within null pointer of type 'struct Product'
hj4.c:181:28: runtime error: load of null pointer of type 'float'
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==1476==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000422814 bp 0x7ffd19c2f280 sp 0x7ffd19c2f260 T1476)
==1476==The signal is caused by a READ memory access.
==1476==Hint: address points to the zero page.
    #0 0x422813  (/root/sandbox/hj4+0x422813)
    #1 0x42246e  (/root/sandbox/hj4+0x42246e)
    #2 0x42232a  (/root/sandbox/hj4+0x42232a)
    #3 0x7f11cd86fb96  (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
    #4 0x402ae9  (/root/sandbox/hj4+0x402ae9)

UndefinedBehaviorSanitizer can not provide additional info.
==1476==ABORTING

Полагаю, мне просто нужны указатели для решения этой проблемы;)

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Я не могу сказать, почему ваш компилятор не предупреждает об этом, но ваша chech_out функция объявлена ​​наверху как chech_out() - без параметров - но определение включает одно: chech_out(struct Product *product). Когда вызывается функция, она обрабатывает мусор в стеке как указатель на продукт и завершается ошибкой.

Редактировать: причина, по которой компилятор не предупреждает, состоит в том, что объявление функций вверху с помощью только открытых + закрытых скобок означаетсписок параметров не определен (чтобы быть совместимым со старыми версиями C): если функция действительно не принимает параметров, определите их как int myfunction(void), где void говорит: «Я не беру параметров»

Исправитьэто

// define struct Product here
void get_number (void);
void show_menu (void);
int get_input (struct Product *);
void chech_out (struct Product *);

и теперь пусть ваш компилятор расскажет вам, что вы пропустили.

0 голосов
/ 07 ноября 2019

Спасибо всем, я попробовал код от Стива, и теперь у меня проблема с компиляцией, которую я не понимаю. Единственные изменения в коде:

void get_number (void);
void show_menu (void);
int get_input (struct Product *);
void chech_out (struct Product *);
int number;

I и получаю ошибку:

hj4.c:35:18: error: too few arguments to function call, expected 1, have 0
                if (get_input ()) // end on "a"
                    ~~~~~~~~~  ^
hj4.c:21:1: note: 'get_input' declared here
int get_input (struct Product *);
^
hj4.c:73:14: error: too few arguments to function call, expected 1, have 0
                        chech_out();
                        ~~~~~~~~~ ^
hj4.c:22:1: note: 'chech_out' declared here
void chech_out (struct Product *);
^
2 errors generated.

Я пытался изменить код на

void get_number (void);
void show_menu (void);
int get_input (struct Product *product);
void chech_out (struct Product *product);
int number;

Новозникла та же проблема.

...