[英]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.