Теперь, прежде чем люди начнут отмечать это как дубли, я прочитал все следующее, ни одно из которых не дает ответа, который я ищу:
- C FAQ: Что не так с приведением возвращаемого значения malloc?
- SO: Должен ли я явно приводить возвращаемое значение malloc ()?
- SO: ненужное приведение указателей в C
- ТАК: Я использую результат malloc?
Как в FAQ по C, так и во многих ответах на приведенные выше вопросы упоминается загадочная ошибка, которую mallocможет скрыть возвращаемое значение приведения; однако ни один из них не дает конкретного примера такой ошибки на практике. Теперь обратите внимание, что я сказал об ошибке , а не о предупреждении .
Теперь, учитывая следующий код:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Компиляция приведенного выше кода с помощью gcc 4.2, с приведением и без него, дает одинаковые предупреждения, и программа выполняется правильно и дает одинаковые результаты в обоих случаях.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
Так может ли кто-нибудь привести конкретный пример кода ошибки компиляции или выполнения, которая могла произойти из-за mallocвозвращаемого значения приведения, или это просто городская легенда?
Изменить Я встретил два хорошо написанных аргумента по этому поводу:
- В пользу приведения: CERT Advisory: немедленно привести результат вызова функции выделения памяти в указатель на выделенный тип
- Против трансляции (ошибка 404 от 14.02.2012: используйте копию Internet Archive Wayback Machine от 27.01.2010. {2016-03-18: "Страница не может сканироваться или отображаться из-за файла robots.txt."})
voidуказателей позволяет компилировать код как C ++; некоторые люди говорят, что это особенность, я бы сказал, что это ошибка;)