Tal situação não pode acontecer por definição (pelo menos em POSIX.1-2008 e depois). O argumento nbyte
para read()
é um size_t
e esse é um tipo inteiro sem sinal.
Não encontrei nenhum comportamento definido na página man para read (3). Meu palpite seria que ele ou lança um erro ou apenas retorna 0. Mas se alguém pudesse confirmar qualquer comportamento definido que seria ótimo. Ou se o comportamento é especificado como indefinido em algum lugar, então declarar que seria ótimo também.
Tal situação não pode acontecer por definição (pelo menos em POSIX.1-2008 e depois). O argumento nbyte
para read()
é um size_t
e esse é um tipo inteiro sem sinal.
Considere o protótipo da função read
:
ssize_t read(int fd, void *buf, size_t count);
Como o argumento count
é um size_t
que não está assinado, se você tentar passar um número negativo, por exemplo. read(fd, buf, -20)
(e você está executando uma máquina de complemento de 2 ;-)) que será interpretada como count
muito grande, fora do intervalo de valores de retorno bem-sucedidos - read()
retorna o número de bytes lidos como ssize_t
, um inteiro assinado do mesmo tamanho que size_t
.
Nesse caso, aplica-se o seguinte:
If the value of nbyte is greater than {SSIZE_MAX}, the result is implementation-defined.
Isso está no linux:
On Linux, read() (and similar system calls) will transfer at most 0x7ffff000 (2,147,479,552) bytes, returning the number of bytes actu- ally transferred. (This is true on both 32-bit and 64-bit systems.)
Na prática, um read()
com count
maior que SSIZE_MAX
resulta em EFAULT
, porque é impossível ajustar o bloco de memória começando em buf
e estendendo-se por count
bytes no arquivo acessível. parte do espaço de endereço.
Em * bsd:
read() and pread() may return the following error: [EINVAL] nbytes was larger than SSIZE_MAX
E o mesmo em solaris:
EINVAL The nbyte argument overflowed an ssize_t.
Nota: o página de manual do openbsd menciona sistemas em que read () poderia retornar um valor negativo ao sucesso; Se você conhece esse sistema, por favor, adicione informações sobre isso aqui ou nos comentários.
Tags read