реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Отладка в KEIL. Как вычислить, откуда в переменной появляются данные?
Golikov A.
сообщение Aug 13 2013, 14:25
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а еще

Код
int data
int * data_adr = &data;


всегда считал что все переменные до инициализации содержат мусор, не знал про статик и глобальные. А кто их нулит? Ведь есть системы где память после загрузки не 0, процы на плисах к примеру, 9 Кбайтные блоки памяти у них не нулятся при старте, даже если просить...

а еще 16 битные переменные в 8 битных контроллерах умеют во время прерывания на половину изменятся, не говорят про 32 и 64 битные переменные... Что же вы теперь программу будете всю отладчиком шерстить? Лучше уже писать безопасный код ИМХО.

Доказательство лучше проверки...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 13 2013, 20:53
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Golikov A. @ Aug 13 2013, 16:25) *
всегда считал что все переменные до инициализации содержат мусор, не знал про статик и глобальные. А кто их нулит?
Обычно это специальный так называемый стартап код, который выполняется перед запуском main(). В стандарте сказано просто что-то вроде "переменные обнуляются". Чем и как - вроде бы не оговаривается.

QUOTE (Golikov A. @ Aug 13 2013, 16:25) *
Что же вы теперь программу будете всю отладчиком шерстить? Лучше уже писать безопасный код ИМХО.
Если бы все были этакими сферическими программистами в вакууме, способными писать код сразу без ошибок... Часто проход по шагам небольшого кусочка кода, исполняющегося не так, как ожидал автор, позволяет за один проход найти ошибку. Все остальные методы отладки, включая медитацию над исходником, требуют гораздо больше времени.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 13 2013, 21:19
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Что есть startup?
кусок кода, который, обычно:
1. Содержит вектора прерываний
2. Содержит кусок кода, который выделит и укажет стек(и)
3. Отправит в __main

Что есть __main? это библиотека, при компиляции собранная с заданными параметрами:
1. Обнулить область ZEROINIT
2. Перенести код, если указан, в нужную область
3. Передать управление в точку main()

Сделать тоже самое просто в C можно спокойно и не напряжно. Без всяких библиотек. Что мешает сделать код инициализации переменных самому? Что позволяет надеяться на абсолютно рандомное содержимое области стека?
По факту топика - реализация сдвига на C (сколько ни сталкивался) всегда записывала 0 в освобожденный разряд. Это не циклический сдвиг на ASM
Про состояние локальных переменных уже все сказали
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 14 2013, 03:43
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(Сергей Борщ @ Aug 14 2013, 00:53) *
Обычно это специальный так называемый стартап код, который выполняется перед запуском main(). В стандарте сказано просто что-то вроде "переменные обнуляются". Чем и как - вроде бы не оговаривается.

Если бы все были этакими сферическими программистами в вакууме, способными писать код сразу без ошибок... Часто проход по шагам небольшого кусочка кода, исполняющегося не так, как ожидал автор, позволяет за один проход найти ошибку. Все остальные методы отладки, включая медитацию над исходником, требуют гораздо больше времени.



Ок, будем знать как говориться... Но я на всякий случай важные переменные все равно буду в начале инициализировать. Потери от этого если и есть, то они мизерные, зато как то внутри спокойнее....

Я не про отладку в целом, я про фразу человека что он сделал массив без размера, фактически указатель, а потом загадив им память начал тыкать отладчиком во все функции и смотреть как локальные переменные объявляются, и не приводит ли это к чему... так проверить все я уверен нельзя. Потому считаю что лучше объявить переменную явно если от ее значения сразу что-то зависит, либо писать код учитывая что в начале она имеет любое значение.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 09:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016