web-dev-qa-db-fra.com

Zéro taille malloc

Question très simple, j'ai fait le programme suivant:

#include <stdlib.h>
int main(int argc, char ** argv)
{
    void * ptr;
    ptr = malloc(0);
    free(ptr);
}

Et ce n'est pas Segfault sur ma machine. Est-ce un comportement portable de STDLIB MALLOC et gratuit, ou je cherche des ennuis?

EDIT: Qu'est-ce qui semble non portable est la valeur renvoyée par Malloc. La question concerne la combinaison MALLOC (0) + libre, pas la valeur de PTR.

44
shodanex

Le comportement est défini la mise en œuvre, vous recevrez un pointeur NULL ou une adresse. L'appel libre pour le pointeur reçu ne devrait toutefois pas causer de problème depuis:

  • gratuit (NULL) est OK, aucune opération n'est terminée
  • gratuit (adresse) est correct, si l'adresse a été reçue de malloc (ou d'autres comme CalloC, etc.)
59
Key

Il est autorisé à renvoyer NULL, et il est autorisé à renvoyer un pointeur non NULL que vous ne pouvez pas dériverser. Les deux voies sont sanctionnées par la norme (7.20.3):

Si la taille de l'espace demandé est zéro, le comportement est défini par la mise en œuvre: soit un pointeur NULL est renvoyé, ou le comportement est comme si la taille était une valeur non nulle, sauf que le pointeur renvoyé ne doit pas être utilisé pour accéder à un objet. .

26
dfa

Désolé pour le problème, j'aurais dû lire les pages de l'homme:

malloc () attribue des octets de taille et renvoie un pointeur à la mémoire allouée. La mémoire n'est pas effacée. Si la taille est 0, alors MALLOC () renvoie NULL ou une valeur de pointeur unique pouvant être transmise avec succès à GRATUIT ().

gratuit () libère l'espace mémoire pointé par PTR, qui doit avoir été renvoyé par un appel précédent à Malloc (), CalloC () ou Realloc (). Sinon, ou si libre (PTR) a déjà été appelé avant, un comportement indéfini se produit. Si PTR est NULL, aucune opération n'est effectuée.

Il semble que c'est vrai au moins pour le GNU Libc

4
shodanex

Selon la norme C

7.20.3 Si la taille de l'espace demandé est nulle, le comportement est défini sur la mise en œuvre: soit un pointeur NULL est renvoyé, ou le comportement est comme si la taille était une valeur non zéro, sauf que le pointeur renvoyé ne doit pas être utilisé pour accéder à l'accès. un objet.

3
rohittt

Mise à jour de la prise en compte de Libt & Pax's Comments:

Le comportement de Calling Malloc (0) est la mise en œuvre dépendante ou en d'autres termes non portable et non défini.

Lien vers CFAQ Question pour plus de détails.

1
Aditya Sehgal

Bien que cela puisse être légal C/C++, il s'agit d'un problème plus important. J'appelle généralement ça "Pointeur Scersiness".

Voir "Ne faites pas d'hypothèses sur le résultat de MALLOC (0) ou de calloc (0)", https://www.securecoding.cert.org/confluence/display/seccode/void+memxx-a.+ DO + PAS + Make + Hypothèses + About + Le + Résultat + de + Malloc% 280% 29 + ou + Calloc% 280% 29 .

0
Jeffrey Walton