Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 226
Регистрация: 12.12.2009
Сообщений: 7,222
Записей в блоге: 1
Завершенные тесты: 1
#1

Не могу заставить g++ не инициализировать локальную переменную нулем - C++

17.12.2015, 06:59. Просмотров 587. Ответов 20
Метки нет (Все метки)

Привет!
Есть такой код (из серии "что будет напечатано на экран")
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
 
int x = 1;
 
namespace A
{
int x = 2;
}
 
int main() 
{
    int x = x;
    cout << x << endl;
    return 0;
}
Ожидается мусор, но g++ и clang++ упорно выводят 0, мусор выводит только MSVC. Посмотрел ассемблерный выхлоп, g++ просто берет 4 байта со стека и печатает их (почему-то на стеке оказывается 0), clang++ явно пишет 0 на стек (т.е. явно инициализирует).
В g++ собирают так
Bash
1
g++ -Wall -pedantic-errors -std=c++11 -O2 -fno-init-local-zero tmp.cpp
варнинги просто чтоб посмотреть на уровень предупреждений, а стандарт указал, чтоб он gnu'шные фичи не использвоал (мало ли), оптимизация понятно для чего (чтоб не дебаг)). -fno-init-local-zero по сути используется по дефолту.

Как получить заветный мусор на выходе?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2015, 06:59     Не могу заставить g++ не инициализировать локальную переменную нулем
Посмотрите здесь:
C++ Не получается инициализировать переменную
C++ Инициализировать переменную ее максимально допустимым значением
Как (можно ли) инициализировать переменную в структуре? C++
C++ Возвращение ссылки на локальную переменную
Возврат ссылки на локальную переменную C++
C++ Требуется только объявить переменную, инициализировать ее не нужно
C++ VS2010 отладчик не видит локальную переменную
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2015, 15:01     Не могу заставить g++ не инициализировать локальную переменную нулем
Еще ссылки по теме:
C++ Передать локальную переменную в новую функцию
Ошибка E2363 Попытка возвратить локальную переменную C++
Как инициализировать глобальную переменную в зависимости от количества строк в файле C++
Как в данном контексте правильно разместить статическую локальную переменную? C++
Как локальную переменную сделать глобально, при это сохранив накопленное в ней значение? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17462 / 5700 / 361
Регистрация: 30.03.2009
Сообщений: 15,639
Записей в блоге: 26
19.12.2015, 15:01     Не могу заставить g++ не инициализировать локальную переменную нулем #21
Ну дык:

C
static bool
gate_initialize_regs (void)
{
  return optimize > 0;
}
В режиме без оптимизаций эта функциональность и не запускается. Тем более, что в режиме без оптимизаций там всё в стек складывается скорее всего. Если я правильно понял комментарий, то инициализацию регистров они делают для упрощения некоторых оптимизаций. Написали, что есть побочный эффект в виде детерминированного поведения программ с неинициализированными переменными, но типа крутые пацаны умеют читать warning'а, а лохи нас не интересуют
Yandex
Объявления
19.12.2015, 15:01     Не могу заставить g++ не инициализировать локальную переменную нулем
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru