atoi() wewnątz wątku - naruszenie ochrony pamięci

0

Witam!

Chciałem użyć wewnątrz wątku funkcję atoi(), ale w momencie gdy program dochodzi do tego momentu następuje naruszenie ochrony pamięci i program się wyłącza. Wątek odpowiada za przesłanie za pomocą socketów danych w zależności od tego o co zostanie zapytany, a funkcja atoi() przekształca część tego zapytania na liczbę. Fragment kodu:

    bzero(buffer,3);
    n = read(newsockfd,buffer,3);
     
	if (n < 0)
	{
	  error("ERROR reading from socket");
	}
     
	printf("Otrzymane zapytanie: %s\n",buffer);
	
	if(n>0 && buffer[0]=='d')
	{
	urzadzenie=atoi(buffer[1]);
	
	  for(int i=0; i<liczba_urzadzen; i++)
	  {
	    if(devices_id[i]==urzadzenie)
	    {
	      p[0]=((pomiar[i]&0x000000FF));
	      p[1]=((pomiar[i]&0x0000FF00)>>8);
	      p[2]=((pomiar[i]&0x00FF0000)>>16);
	      p[3]=((pomiar[i]&0xFF000000)>>32);
	      snprintf(impulsy, 20, "%c%c%c%c%c\n\r",buffer[0],p[3],p[2],p[1],p[0]);
	      break;
	    }
	  }

Jakieś pomysły?

z góry dzięki
pozdrawiam
herszt

0
  1. Jeśli read() na sockecie zwróci ci 0 to też jest pewien "błąd" bo znaczy tyle ze socket z którego czytasz został zamknięty
  2. Skąd wiesz że istnieje buffer[1]? Nigdzie nie sprawdziłeś że n>1
  3. Co to za zmienne urzadzenie, impulsy oraaz tablica p[]? Jeśli operujesz tu na wątkach to czy aby na pewno poprawnie synchronizujesz tu wszystko?
0
Shalom napisał(a)
  1. Jeśli read() na sockecie zwróci ci 0 to też jest pewien "błąd" bo znaczy tyle ze socket z którego czytasz został zamknięty

printf("Otrzymane zapytanie: %s\n",buffer);
zawsze pokazuje poprawnie co otrzymał, a gdy wykomentuję atoi() to warunek wykonuje się poprawnie:

if(n>0 && buffer[0]=='d')
{
//urzadzenie=atoi(buffer[1]);
...
}
Shalom napisał(a)
  1. Skąd wiesz że istnieje buffer[1]? Nigdzie nie sprawdziłeś że n>1

if(n>0 && buffer[0]=='d')

choć tu sprawdzam tylko czy n odebranych bajtów jest większe od 0, to buffer ma 3 pola, a ja zawsze przesyłam co najmniej 2-3 znaki, które się wyświetlają po stronie serwera poprawnie, o czym powyżej

Shalom napisał(a)
  1. Co to za zmienne urzadzenie, impulsy oraaz tablica p[]? Jeśli operujesz tu na wątkach to czy aby na pewno poprawnie synchronizujesz tu wszystko?

urzadzenie jest typu int, impulsy typu long - zadeklarowane na początku wątku
p[] - jest zmienną zadeklarowaną również na początku wątku, tablicą char
pomiar[] jest tablicą globalną, poza wątkiem zmiennych typu long, jak jej nie ma to atoi(), również działa tak samo

Jeśli jest taka potrzeba to mogę zamieścić kod wątku w całości, nie chciałem póki co się rozpisywać w nadziei, że popełniłem jakiś trywialny błąd.

z góry dzięki
pozdrawiam
herszt

0

atoi przyjmuje adres, a nie zmienna, wiec wystarczy, ze dasz atoi(&buffer[1])

0

@up no tak, klasyczny błąd przy używaniu funkcji z C, ale ja mimo wszystko uważam że powinieneś obsługiwać błędy...
Co z tego że wysyłasz zawsze 2-3 znaki? Ważne jest co obierasz! Jeśli akurat będzie jakis problem z połączeniem i wyśle się tylko 1 znak to co?

0
Shalom napisał(a)

@up no tak, klasyczny błąd przy używaniu funkcji z C, ale ja mimo wszystko uważam że powinieneś obsługiwać błędy...
Co z tego że wysyłasz zawsze 2-3 znaki? Ważne jest co obierasz! Jeśli akurat będzie jakis problem z połączeniem i wyśle się tylko 1 znak to co?

Racja, mój głupi błąd! Teraz mogę dodać porządną obsługę błędów. Chciałem to najpierw sprawdzić w warunkach w miarę stabilnych i jak będzie działać zająć się resztą.

dzięki
pozdrawiam
herszt

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