LINUX.ORG.RU

Почему gcc не ругается на неинициализированные массивы и структуры?

 


0

2

main.c:

struct s
{
	int x;
};

int main()
{
	int i;
	int a[8];
	struct s z;

	return i + a[7] + z.x;
}
Делаю:
$ gcc main.c -Wall
main.c: In function ‘main’:
main.c:12: warning: ‘i’ is used uninitialized in this function
Можно было бы подумать что массивы и структуры инициализируются нулями по умолчанию.
Но если убрать i из возвращаемой суммы, то будет вот что:
$ gcc main.c -Wall
main.c: In function ‘main’:
main.c:8: warning: unused variable ‘i’
$ ./a.out
$ echo $?
196
Так какого хрена gcc не ругается?!

Можно было бы подумать что массивы и структуры инициализируются нулями по умолчанию.

Только если они глобальные. В тех, что в стеке (как в данном случае), будет мусор.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

используй scan-build из clang - он обругает такие места

wota ★★
()

Потому что ты теоретически можешь передать неинициализированный массив или структуру в некую функцию другого модуля, который ее проинициализирует как надо. Компилятор естественно не знает, что произойдет при вызове, но знает, что это возможно. Поэтому автоматическая инициализация это потенциальный оверхед. Инициализируй сам = { 0 }.

anonymous
()

Так какого хрена gcc не ругается?!

These warnings occur for individual uninitialized or clobbered elements of structure, union or array variables as well as for variables that are uninitialized or clobbered as a whole. They do not occur for variables or elements declared volatile. Because these warnings depend on optimization, the exact variables or elements for which there are warnings depends on the precise optimization options and version of GCC used.

$ gcc -Wall main.c 
$ gcc -Wall -O1 main.c 
main.c: In function ‘main’:
main.c:13:10: warning: ‘a[7]’ is used uninitialized in this function [-Wuninitialized]
main.c:13:17: warning: ‘z.x’ is used uninitialized in this function [-Wuninitialized]
i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

теоретически можешь передать неинициализированный массив или структуру в …

Я и переменную могу передать. Зачем он тогда на переменную ругается?

теоретически можешь передать

Но не передавал ведь.

Инициализируй сам = { 0 }.

Спасибо, конечно, но инициализировать я умею :)

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

И зачем, позвольте спросить, так сделано?

Спроси в http://gcc.gnu.org/ml/gcc-help/ , там больше шансов получить ответ, если конечно он тебе действительно нужен.

i-rinat ★★★★★
()

Так какого хрена gcc не ругается?!

воспитан хорошо, вот и не ругается.

если серьёзно, то пиши разрабам.

aiqu6Ait ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.