Перейти к содержанию
    

Указатель на невыровненную память

++  гораздо жещще проверяет соответствие типов аргументов.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, repstosw сказал:

А меня нервирует, что C++ не любит void main(void).

Это ваш компилятор "не любит". А не си++.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, repstosw сказал:

Я по всей строгости - пишу void, если нет параметров. Но коллеги не согласны с моим решением - оставляют пустые скобки.  Это принципиально - для C, а для C++ ?

Это значит, что Вы пишете на Си, а коллеги - на C++. Для Вас писать принципиально, для коллег - нет.

В Си отсутствие скобок в (по крайней мере старых) стандартах подразумевало немного другое, а именно - возможность принимать заранее неизвестное кол-во аргументов неизвестного типа.

В C++ func() равносильно func(void), поэтому для снижения ряби в глазах void не пишут.

Поэтому разница между Си и C++ в этом случае - огромная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, repstosw said:

А меня нервирует, что C++ не любит void main(void). пишет, что main() должен возвращать int. У меня программа постоянно в main() в вечном цикле. Даже освобождение ресурсов не нужно, так как программа работает вечно, пока питание не закончится.

в плюсах есть перегрузка функций с name mangling, и там void main() и int main() в результате имеют разные имена.
соответственно из стартап кода на ассемблере нельзя просто сказать call main, наплевав на его тип.

9 hours ago, repstosw said:

Тут ещё споры разгорелись, по поводу того, если функция не имеет аргументов - надо ли void писать в скобках или нет. Я по всей строгости - пишу void, если нет параметров.  Но коллеги не согласны с моим решением - оставляют пустые скобки.  Это принципиально - для C, а для C++ ?

если правильно помню, принципиально это было только для С89, если не раньше..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хех, я думал, вы до сих пор ещё память ровняете, а вы уже за ни в чем неповинный void  уцепились 🙂

Выход из main() возможен, и более того, после него есть "загробная жизнь", так сказать, там ведь есть продолжение в стартапе. Обычно, из main() выход будет по ошибке, а возвращаемое значение - код ошибки. В "большом" программировании (для компов) возвращаемое значение по завершению работы программы говорит о результатах завершения: 0 - всё в порядке, иные значения - какие-то косяки. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, EdgeAligned сказал:

Выход из main() возможен, и более того, после него есть "загробная жизнь", так сказать, там ведь есть продолжение в стартапе.

Вот вам стартап, покажите мне "загобную жизнь" после bl main
 

    .section  .text.Reset_Handler
  .weak  Reset_Handler
  .type  Reset_Handler, %function
Reset_Handler:  
  ldr   sp, =_estack     /* set stack pointer */

/* Copy the data segment initializers from flash to SRAM */  
  ldr r0, =_sdata
  ldr r1, =_edata
  ldr r2, =_sidata
  movs r3, #0
  b LoopCopyDataInit

CopyDataInit:
  ldr r4, [r2, r3]
  str r4, [r0, r3]
  adds r3, r3, #4

LoopCopyDataInit:
  adds r4, r0, r3
  cmp r4, r1
  bcc CopyDataInit
  
/* Zero fill the bss segment. */
  ldr r2, =_sbss
  ldr r4, =_ebss
  movs r3, #0
  b LoopFillZerobss

FillZerobss:
  str  r3, [r2]
  adds r2, r2, #4

LoopFillZerobss:
  cmp r2, r4
  bcc FillZerobss

/* Call the clock system initialization function.*/
  bl  SystemInit   
/* Call static constructors */
    bl __libc_init_array
/* Call the application's entry point.*/
  bl  main
  bx  lr    
.size  Reset_Handler, .-Reset_Handler

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

35 минут назад, _3m сказал:

Вот вам стартап, покажите мне "загобную жизнь" после bl main

Так нечестно)) Не проще ли отдать всю работу по подготовке runtime Си - компилятору?

Самодельными предстартапами main() Вы несколько сужаете потенциальные возможности компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предпоследняя строчка - загробная жизнь после смерти программы.

Вообще, без разницы, на каком языке написан стартап. И без разницы, есть ли там загробная жизнь или нет. Это в некоторой мере условность, но ничто не запрещает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про int main(void) - насколько я знаю, в стандарте прописано именно возвращаемое значение int. А касательно пустого аргумента функций, то в Си обязательно писать (void), иначе будет подразумеваться неявно тип int. В С++ наоборот, пустые скобки неявно означают void, но за отсутствие явного указания void компилятор не ругается. Всё ведь очень просто.

Более того, аргумент в main() может принимать либо void, либо два аргумента типа int и char**. Это тоже прописано в стандарте. Ну и для C обязательно писать void, для С++ - не обязательно.

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, _3m сказал:

Вот вам стартап, покажите мне "загобную жизнь" после bl main
 

  bl  main
  bx  lr    
.size  Reset_Handler, .-Reset_Handler

Странный какой-то стартап. С таким после main() не то что загробная жизнь, а и HardFault возможен. Или что угодно.  :unknw:

Вы где такое откопали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, jcxz сказал:

Странный какой-то стартап. С таким после main() не то что загробная жизнь, а и HardFault возможен. Или что угодно.  :unknw:

Вы где такое откопали?

STM32CubeIDE. Интересно где вы HardFault нашли ? Там все прямо как грабли 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, EdgeAligned сказал:

А касательно пустого аргумента функций, то в Си обязательно писать (void), иначе будет подразумеваться неявно тип int.

Да не будет ничего подразумеваться. Вы путаете это со случаем, когда в месте вызова компилятору неизвестен прототип функции.
 

3 минуты назад, _3m сказал:

STM32CubeIDE. Интересно где вы HardFault нашли ? Там все прямо как грабли 🙂

Толстый намек на то, что после bx lr - мусор. А пользовались бы стандартным компиляторным вызовом __main(), библиотека вызвала бы __exit(), которая по-умолчанию была бы зациклена:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, _3m сказал:

STM32CubeIDE. Интересно где вы HardFault нашли ? Там все прямо как грабли 🙂

HF будет после перехода BX LR по случайному адресу. Так как функция не обязана сохранять значение LR, значит в общем случае на выходе main() в LR - мусор. И BX LR отправит программу по неизвестному адресу, с большой вероятностью в HF.

Не знаю - может конечно Куб сохраняет LR? Надо его соглашения вызова смотреть. Вроде как не обязан. Или посмотреть листинг любой функции, использующей LR. Я кубом не пользуюсь  - посмотреть не могу.

Если у него какие-то свои соглашения вызова, тогда будут проблемы с совместимостью с obj-файлами, созданными другими компиляторами.

15 минут назад, Arlleex сказал:

Толстый намек на то, что после bx lr - мусор.

Не "после BX LR", а уже перед ней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Показываю наглядно содержимое линк-регистра при выполнении bx lr: переход будет осуществлен по указанному в lr адресу, а далее ситуация усугубляется, и поскольку lr будет содержать недопустимый адрес, произойдет HF

 

Снимок экрана 2023-10-24 210119.jpg

Снимок экрана 2023-10-24 210318.jpg

Снимок экрана 2023-10-24 210351.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, jcxz said:

Не знаю - может конечно Куб сохраняет LR? Надо его соглашения вызова смотреть.

Куб то тут при чём ?

А из-за чего весь сыр-бор идёт ? Изначально было про выравнивание вроде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...