[c] długość char a funkcja read

witam. mam kod:

#include 

//jakis kod

char text[100];

read(fifo_tab[0],text,100);

pytania:

  1. czy trzeci z parametrów w read można opuścić definicje (chodzi o te 100);

  2. co się dzieje jak odczytany strumień jest krótszy niż 100;

  3. czy po definicji char[100] na końcu jest “/0” czy nie

A czy tak trudno sobie to sprawdzić?

Pierwszy link który znalazłem w Google mówi o tym jak działa ta funkcja. Jedyne czego możesz nie znaleźć(może nie na tej stronie, ale na innych) to odpowiedź na pytanie trzecie. Odpowiedź jest prosta: nie. Do funkcji read podajesz wskaźnik na niezdefiniowany typ(void*) więc funkcja nie wie czy jest to ciąg znaków czy nie. O to musisz sam zadbać.

Może się nie jasno wyraziłem, albo czytać nie umiem (tego nie wykluczam)

W punkcie 2 chodziło mi o taką sytuacje:

Strumień ma 50 znaków, wczytujemy do do bufora 100 znakowego, co będzie na miejscach od 51 do 100? Czy coś wogóle z nimi zrobi funkcja read?

Na logikę - nic z nimi nie zrobi, bo skąd ma wiedzieć, że bufor ma 100 bajtów? Zapisze tyle ile jej podano w argumencie.

Wiesz czym jest buffor? Nastąpi wyciek z niego… W uproszczeniu tablica, ciąg znaków jest wskaźnikiem na dany obszar pamięci, przepełniając go możemy nadpisywać wartości innych danych znajdujących się za właściwą komórką pamięci które mogą być kluczowe w działaniu aplikacji. Proponuje czasem używać umiejętnie strlen bądź strncpy (tutaj kluczowym elementem jest trzeci parametr którym możemy uciąć niechcianą resztę ciągu), gdy nadpiszemy za dużo pamięci programu (każdy program ma przydzieloną określoną ilość) to nastąpi segmentacja pamięci czyli wykroczenie za obszar pamięci danego programu i system dokona interwencji, aplikacja nie wykona swojego działania i prawdopodobnie się wyłączy. Czemu właściwie system chroni pamięć innych programów? Odpowiedź jest prosta, wyobraźmy sobie po prostu że system ma przydzieloną pamięć i trzyma tam bardzo ważne które ważą na stabilności systemu, co się stanie jak je przepełnieniem wkroczymy na nie…? Domyśl się.

Jest to częsty błąd wielu aplikacji dodam więcej, jeżeli instrukcja odpowiada choćby za autoryzacje jest to bardzo groźny błąd chociaż nie jest to regułą bo potencjalny napastnik może w niektórych przypadkach podczepić i wykonać swój kod to i tak to jest groźne, do dzisiaj są znajdowane krytyczne luki tego typu w popularnych aplikacjach.

Poczytaj teorię o stercie i stosie i ogólnie o pamięci programu. A następnie poszukaj informacji o atakach buffer overflow i heap overflow.

By to zrozumieć radze pobawić się czasem debugerem i samą aplikacją na przeróżne sposoby (wprowadzanie nie przewidzianych w programie działań), osobiście polecam GDB.

Funkcja read zwraca ilość bajtów, które wczytała. Możesz więc sam dopisać na koniec ciągu znaków 0(czy inaczej ‘\0’, jeżeli mamy na myśli zwykłe char).