簡體   English   中英

在libusb中使用字符串會導致分段錯誤

[英]Using a string with libusb causes segmentation fault

我正在使用帶有gcc的netbeans進行編譯。 當我運行附帶的代碼時,出現錯誤: RUN FINISHED; Segmentation fault; core dumped; real time: 310ms; user: 40ms; system: 10ms RUN FINISHED; Segmentation fault; core dumped; real time: 310ms; user: 40ms; system: 10ms

如果將'char stringData'注釋掉,則沒有分段錯誤。 另外,如果刪除libusb_get_device_descriptor(以及隨附的結構引用),則不會出現分段錯誤。

如果以調試模式運行,則會顯示錯誤消息:

#error "Never use <bits/string_fortified.h> directly; include <string.h> instead."

我看不到它們如何相互影響。

#include <stdio.h>
#include <stdlib.h>
#include <libusb.h>
#define DATLENGTH 15

int main() {
    libusb_context *context;
    int i; 
    libusb_device **list;
    libusb_device *device;
    const struct libusb_version *libVersion;
    ssize_t numDev = 0;
    struct libusb_device_descriptor *dev_descriptor;
    struct libusb_config_descriptor *config;
    libusb_device_handle * dev_handle;
    char stringData[DATLENGTH];

    libusb_init(&context);


    libVersion = libusb_get_version();
    printf("Library Version: %i.%i.%i.%i\n", (int)libVersion->major, (int)libVersion->minor, (int)libVersion->micro, (int)libVersion->nano);

    numDev = libusb_get_device_list(context, &list);    
    if(numDev < 0){
        printf("Error %i\n", numDev);
        return -1;
    }
    else{
        printf("Number of devices: %i\n\n", numDev);
    }

    for(i=0;i<numDev;i++){    
        device = list[0];

        struct libusb_device_descriptor *dev_descriptor;

        libusb_get_device_descriptor(device, dev_descriptor);
        printf("Device #:  %i\n", i);
        printf("idVendor:  %04x\n", (dev_descriptor->idVendor & 0x0000FFFF));
        printf("idProduct: %04x\n", (dev_descriptor->idProduct & 0x0000FFFF));
        printf("Number of Configurations: %i\n", dev_descriptor->bNumConfigurations);
        libusb_open(device, &dev_handle);
        libusb_get_string_descriptor_ascii(dev_handle, dev_descriptor->iManufacturer, stringData, DATLENGTH);
        printf("Manufacturer ID: %s\n", stringData);        
        libusb_get_string_descriptor_ascii(dev_handle, dev_descriptor->iProduct, stringData, DATLENGTH);
        printf("Product ID: %s\n", stringData);       


        printf("\n");
        }

        libusb_free_device_list(list, 1); 

        libusb_exit(context);

    return (EXIT_SUCCESS);
}

您正在使用以下方法產生未定義的行為:

struct libusb_device_descriptor *dev_descriptor;
libusb_get_device_descriptor(device, dev_descriptor);

dev_descriptor應該是指向struct libusb_device_descriptor的指針。 但這是指向無處的指針,因為您從未初始化過它。 libusb_get_device_descriptor嘗試將信息存儲在結構中時,它將出現段錯誤或覆蓋隨機存儲器。

您應該將其更改為:

struct libusb_device_descriptor dev_descriptor;
libusb_get_device_descriptor(device, &dev_descriptor);

它實際上在堆棧上分配了一個struct libusb_device_descriptor ,然后傳遞該結構的地址。 請注意,然后您將不得不將dev_descriptor->field更改為dev_descriptor.field

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM