Entendendo o NSS PK11_CIPHEROP e C Alocação de memória
-
12-09-2019 - |
Pergunta
Ter alguns problemas com C. Eu tenho este é o meu código:
// First line works, second line does not!
char outbuf[1024];
// char *outbuf = (char *) malloc(1024); // char is always 1
Estou passando este outbuf para um método chamado PK11_CipherOp()
, declarado na biblioteca NSS. A documentação para este método pode ser encontrada aqui, você pode ver que espera um char *
Para o param do outbuf.
Não consigo entender por que a primeira linha funciona de maneira confiável e a segunda linha não!
Para ver o código completo, veja Fonte de arquivo
Obrigado,
Hamilton
Solução
Seu problema parece ser uma declaração ausente para malloc
- Você não incluiu <stdlib.h>
.
Isso significa que seu compilador está assumindo que a função retorna int
, que está sendo explicitamente lançado para (unsigned char *)
. Se você estiver em uma plataforma onde sizeof(int) != sizeof(void *)
, como x86-64, então isso vai gerenciar o valor do ponteiro.
Isso ilustra perfeitamente por que em C (ao contrário de C ++) você deveria não lançar o resultado de malloc()
- Fazer isso é desnecessário e esconde esse bug exato de você. Também ilustra por que você deve ativar os avisos do compilador.
A correção é #include <stdlib.h>
, e remover o elenco de malloc()
enquanto você está lá.
Termo aditivo:
Sua outra questão é que você está passando sizeof(outbuf)
para PK11_CipherOp()
. Isso estará correto (igual a out_buf_size
) quando outbuf
é uma matriz, mas está incorreto (o tamanho do ponteiro em si) quando outbuf
é um ponteiro.
Substitua cada um sizeof(outbuf)
com out_buf_size
E você deve estar pronto para ir (há outro depois) ...
Outras dicas
Encontrou o problema. Acontece que eu estava usando sizeof(outbuf)
como um dos parâmetros. Quando o outbuf é declarado na pilha, como char outbuf[1024];
Isso retorna 1024. no entanto, quando o outbuf está na pilha, como char * outbuf = malloc(1024);
O tamanho do USBUF é apenas 4. Esse parâmetro disse à função quanto espaço estava disponível no USBUF, então a função pensou que tinha apenas 4 bytes de sala. Precisa de 16 para fazer nada Por isso, apenas retornou sem realizar nenhum trabalho.