J'utilise this library for libgps et j'ai quelques problèmes pour le faire fonctionner correctement.Segfault jeté sur une ligne de code
L'erreur de mon débogueur après qu'il dit segfault est:
Cannot find bounds of current function
La ligne de code est ce lancer located in this file, en ligne 132.
uint8_t checksum= (uint8_t)strtol(strchr(message, '*')+1, NULL, 16);
Je ne connais pas le contexte de cette du tout, et je ne sais pas pourquoi cela ne ferait pas de segfault.
Mon code:
#include <stdio.h>
#include <stdlib.h>
#include <gps.h>
#include <math.h>
/*
*
*/
int main(int argc, char** argv) {
// Open
gps_init();
gps_on();
loc_t data;
gps_location(&data);
printf("%lf %lf\n", data.latitude, data.longitude);
return (EXIT_SUCCESS);
}
La fonction gps_location()
vous emmène dans gps.c
et de là elle se heurte serial.c
, une fois qu'il court:
void serial_readln(char *buffer, int len)
{
char c;
char *b = buffer;
int rx_length = -1;
while(1) {
rx_length = read(uart0_filestream, (void*)(&c), 1);
if (rx_length <= 0) {
//wait for messages
sleep(1);
} else {
if (c == '\n') {
*b++ = '\0';
break;
}
*b++ = c;
}
}
}
Sur le break
retourne à gps.c
va dans:
switch (nmea_get_message_type(buffer)) {
qui le prend en nmea.c
pour nmea_get_message_type
ci-dessus.
Il passe ensuite la ligne:
if ((checksum = nmea_valid_checksum(message)) != _EMPTY)
le prendre jusqu'à: uint8_t checksum= (uint8_t)strtol(strchr(message, '*')+1, NULL, 16);
qui est où l'erreur est.
À quoi est-ce dû?
Edit:
uint8_t
est défini comme: typedef unsigned char uint8_t;
S'il n'y a pas ' '*'' dans la chaîne, 'strchr()' 'rendement null', qui' strtol() 'est pas conçu pour gérer. Ajoutez une vérification de 'NULL' avant de passer le résultat de' strchr() 'à' strtol() '. – EOF
Je ne vois pas assez de code pour savoir si cela contribue à votre problème, mais 'serial_readln()' 'ne tient pas compte len', donc pourrait être écrit après la fin de' buffer'. Je le réparerais dans tous les cas, pour lever tout doute. – donjuedo
@MattMcNabb ce n'est pas mon code - je ne trouve pas de bibliothèques fiables et à jour pour une utilisation avec GPSD (GPD Deamon). Je pense que le message étant nul est la bonne réponse ici. Ma connaissance de la programmation est loin d'assez bon pour faire ma propre bibliothèque pour ce genre de chose –